python numpy ValueError:操作数无法与形状一起广播

时间:2014-07-03 17:52:23

标签: python numpy

在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)更正此问题,但原始问题仍然存在。

8 个答案:

答案 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

(请注意,如果Xy的类型为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