用广播减去numpy中每一行的平均值

发布于 2021-01-29 15:59:59

我尝试使用广播减去numpy中矩阵的每一行的平均值,但出现错误。知道为什么吗?

这是代码:

from numpy import *
X = random.rand(5, 10)
Y = X - X.mean(axis = 1)

错误:

ValueError: operands could not be broadcast together with shapes (5,10) (5,)

谢谢!

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    mean方法是 归约
    运算,表示将一维数字集合转换为单个数字。当您沿轴对n维数组应用归约时,numpy将该维折叠为归约值,从而得到(n-1)维数组。在您的情况下,由于X形状为(5,10),并且沿轴1进行了归约,因此最终得到形状为(5,)的数组:

    In [8]: m = X.mean(axis=1)
    
    In [9]: m.shape
    Out[9]: (5,)
    

    当您尝试从减去该结果时X,您尝试从形状为(5,10)的数组中减去形状为(5,)的数组。这些形状与广播不兼容。(请参阅《用户指南》中有关广播的描述。)

    为了使广播按您希望的方式工作,mean运算的结果应该是形状为(5,1)的数组(与形状(5,10)兼容)。在最新版本的numpy中,约简操作(包括mean)具有一个称为的参数,该参数keepdims告诉函数不要折叠已缩减的维。而是保留长度为1的平凡尺寸:

    In [10]: m = X.mean(axis=1, keepdims=True)
    
    In [11]: m.shape
    Out[11]: (5, 1)
    

    使用旧版本的numpy,您可以reshape用来还原折叠后的尺寸:

    In [12]: m = X.mean(axis=1).reshape(-1, 1)
    
    In [13]: m.shape
    Out[13]: (5, 1)
    

    因此,根据您的numpy版本,您可以执行以下操作:

    Y = X - X.mean(axis=1, keepdims=True)
    

    或这个:

    Y = X - X.mean(axis=1).reshape(-1, 1)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看