2014-07-03 51 views
48

在numpy的一起广播,我有两个 “阵列” 中,X为(M,N)和y是矢量(N,1)蟒numpy的ValueError异常:操作数不能与形状

使用

X*y 

我收到错误

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

当(97.2)×(2,1),显然是一个法律矩阵运算,应该给我一个(97,1)载体

编辑:

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

+0

什么是“原始问题”? 'X * y'不应该工作(而且不),但是'np.dot(X,y)'和'X.dot(y))'应该可以工作(并且对我来说他们可以)。 – DSM

+2

'*'不是'ndarray'对象的矩阵乘法。 – user2357112

回答

36

dot是矩阵乘法,但*做别的。

我们有两个数组:

  • 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.matrix类型,则可以使用星号作为矩阵乘法我的建议是,保持从numpy.matrix远,也容易)

你的阵列应该没问题,numpy.dot;如果您在numpy.dot上遇到错误,则必须有其他错误。如果形状是错误的numpy.dot,你会得到一个不同的异常:

ValueError: matrices are not aligned 

如果仍然收到此错误,请张贴问题的一个小例子。与形状像您的阵列的示例乘法成功:

In [1]: import numpy 

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape 
Out[2]: (97, 1) 
18

每韦斯McKinney的的Python for Data Analysis

The Broadcasting Rule: Two arrays are compatable for broadcasting if for each trailing dimension (that is, starting from the end), the axis lengths match or if either of the lengths is 1. Broadcasting is then performed over the missing and/or length 1 dimensions.

换句话说,如果试图将两个矩阵相乘(线性代数意义上的),然后你想X.dot(y),但如果你想从y矩阵广播标量到X那么你需要执行X * y.T

例子:

>>> 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]]) 
2

,在点,但之后并没有出现错误有可能。 例如尝试此

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显然是错误的(12x5 5x5的X = 12x5不能逐元素乘法5x12),但numpy的会给你

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

的错误是误导性的;然而,这方面存在问题。

相关问题