在numpy中,我有两个“数组”,X
是(m,n)
和y
是一个向量(n,1)
使用
X*y
我收到错误
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
何时 (97,2)x(2,1)
显然是合法的矩阵运算,应该给我一个(97,1)
向量
编辑:
我已使用纠正了此X.dot(y)
问题,但原始问题仍然存在。
*
不是ndarray
对象的矩阵乘法。
在numpy中,我有两个“数组”,X
是(m,n)
和y
是一个向量(n,1)
使用
X*y
我收到错误
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
何时 (97,2)x(2,1)
显然是合法的矩阵运算,应该给我一个(97,1)
向量
编辑:
我已使用纠正了此X.dot(y)
问题,但原始问题仍然存在。
*
不是ndarray
对象的矩阵乘法。
Answers:
dot
是矩阵乘法,但*
还有其他功能。
我们有两个数组:
X
,形状(97,2)y
,形状(2,1)使用Numpy数组时,该操作
X * y
可以逐个元素地完成,但是可以在一个或多个维度上扩展其中一个或两个值以使其兼容。此操作称为广播。尺寸为1或缺少尺寸的尺寸可用于广播。
在上面的示例中,尺寸不兼容,因为:
97 2
2 1
此处在第一维中有冲突的数字(97和2)。这就是上面的ValueError所抱怨的。第二个维度可以,因为数字1不会与任何东西冲突。
有关广播规则的更多信息,请访问:http : //docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(请注意,如果X
和y
的类型为numpy.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)
每个numpy文档:
在两个数组上运算时,NumPy逐元素比较其形状。它从尾随尺寸开始,一直向前发展。在以下情况下,两个维度兼容:
- 它们相等,或者
- 其中之一是1
换句话说,如果您试图将两个矩阵相乘(在线性代数意义上),那么您就想要,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]])
该错误可能不是在点积中发生的,而是在此之后发生的。例如试试这个
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显然是错误的(12x1 X 1x5 = 12x5不能逐个元素乘以5x12),但是numpy会给你
ValueError: operands could not be broadcast together with shapes (12,1) (1,5)
错误是令人误解的。但是那条线上有一个问题。
X*y
不应该工作(而事实并非如此),但np.dot(X,y)
并X.dot(y))
应工作(对我来说他们做的)。