在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 :(得分:63)
dot
是矩阵乘法,但*
会做其他事情。
我们有两个数组:
X
,shape(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 :(得分:26)
Per Wes McKinney&#39> Python for Data Analysis
广播规则:如果每个尾随维度(即从结尾开始),轴长度匹配或两者中的任何一个,则两个数组可用于广播长度为1.然后在缺失和/或长度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 :(得分:10)
错误在点积中可能不会发生,但之后可能会发生。 例如,试试这个
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)
该错误具有误导性;但是那条线上有一个问题。
答案 3 :(得分:1)
使用np.mat(x)* np.mat(y),就可以了。
答案 4 :(得分:1)
我们可能会混淆a * b是点积。
但是实际上,它是广播。
点产品: a.dot(b)
广播:
术语广播是指numpy如何对待具有不同数组的数组 算术运算期间的尺寸会导致某些 约束,较小的数组将在较大的数组中广播,因此 它们具有兼容的形状。
(m,n)+-/ *(1,n)→(m,n):该操作将应用于m行
答案 5 :(得分:0)
您正在寻找np.matmul(X, y)
。在Python 3.5+中,您可以使用X @ y
。
答案 6 :(得分:0)
将数组转换为矩阵,然后执行乘法。
X = np.matrix(X)
y = np.matrix(y)
X*y
答案 7 :(得分:0)
ValueError: operands could not be broadcast together with shapes (x ,y) (a ,b)
where x ,y are variables
Basically this error occurred when value of y (no. of columns) doesn't equal to the number of elements in another multidimensional array.
Now let's go through by ex=>
coding apart
{
import numpy as np
arr1= np.arange(12).reshape(3,4)
}
output of arr1
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
{ arr2= np.arange(4).reshape(1,4)
or { both are same 1 rows and 4 columns
arr2= np.arange(4)
}
ouput of arr2=>
array([0, 1, 2, 3])
no of elements in arr2 is equal no of no. of the columns in arr1 it will be excute.
{
for x,y in np.nditer([a,b]):
print(x,y)
}
output => 0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3
8 0
9 1
10 2
11 3