python numpy ValueError:操作数不能和形状一起播放

在numpy中,我有两个“数组”,X是(m,n),y是一个向量(n,1)

运用

X*y # or, even np.dot(X,y) 

我收到错误

 ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

当(97,2)x(2,1)显然是一个合法的matrix运算,应该给我一个(97,1)向量

编辑:

我已经使用X.dot(y)更正了这个问题,但原来的问题仍然存在。

我们有两个数组:

  • X ,形状(97,2)
  • y ,形状(2,1)

用Numpy数组操作

 X * y 

是按照元素来完成的,但是其中一个或两个值可以在一个或多个维度上进行扩展以使它们兼容。 这个操作被称为广播。 尺寸为1或缺失的尺寸可用于广播。

在上面的例子中,尺寸是不相容的,因为:

 97 2 2 1 

这里在第一维(97和2)有相互冲突的数字。 这就是上面的ValueError所抱怨的。 第二个维度是可以的,因为第一个和任何东西都不冲突。

有关广播规则的更多信息: http : //docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(请注意,如果Xynumpy.matrixtypes,那么星号可以用作matrix乘法,我的build议是远离numpy.matrix ,它往往比简化更复杂。)

但是,你的数组应该与numpy.dot ,所以还有其他事情必须发生。 如果numpy.dot抛出一个exception,它会抱怨:

 ValueError: matrices are not aligned 

如果仍然出现这个错误,请发布一个最简单的问题示例。 有用:

 import numpy as np np.dot(np.ones((97,2)), np.ones((2,1))) 

返回一个(97,1)数组。

Per Wes McKinney的Python for Data Analysis

广播规则 :如果对于每个尾随维度 (即,从结尾开始),轴长度匹配或者其中任一长度是1,则广播规则 :两个数组是可压缩的。然后在丢失和/或长度1尺寸。

换句话说,如果你试图乘以两个matrix(在线性代数意义上),那么你需要X.dot(y)但是如果你试图从matrixyX传递标量,那么你需要执行X*yT
例:

 >>> import numpy as np >>> X = np.arange(8).reshape(4,2) >>> y = np.arange(2).reshape(1, 2) # create a 1x2 matrix >>> X*y array([[0,1], [0,3], [0,5], [0,7]]) 

有可能是错误没有发生在点后面。 例如试试这个

 a = np.random.randn(12,1) b = np.random.randn(1,5) c = np.random.randn(5,12) d = np.dot(a,b) * c 

np.dot(a,b)会没事的; 然而np.dot(a,b)* c显然是错误的(12×5 X 5×5 = 12×5不能元素乘以5×12),但numpy会给你

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

错误是误导性的; 然而,这个问题有一个问题。