问题:python numpy ValueError:操作数不能与形状一起广播
在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)
问题,但原始问题仍然存在。
回答 0
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)
回答 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]])
回答 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显然是错误的(12×1 X 1×5 = 12×5不能逐个元素乘以5×12),但是numpy会给你
ValueError: operands could not be broadcast together with shapes (12,1) (1,5)
错误是令人误解的。但是那条线上有一个问题。
回答 3
使用np.mat(x) * np.mat(y)
,它将起作用。
回答 4
您正在寻找np.matmul(X, y)
。在Python 3.5+中,您可以使用X @ y
。
回答 5
我们可能会混淆a * b是点积。
但实际上,它是广播。
点积: a.dot(b)
广播:
术语广播是指numpy在算术运算期间如何处理具有不同尺寸的数组,这会导致某些约束,较小的数组将在较大的数组上广播,以使它们具有兼容的形状。
(m,n)+-/ *(1,n)→(m,n):该操作将应用于m行