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

yay*_*ayu 100 python numpy

在numpy中,我有两个"数组",X(m,n)y是一个向量(n,1)

运用

X*y
Run Code Online (Sandbox Code Playgroud)

我收到了错误

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 
Run Code Online (Sandbox Code Playgroud)

什么时候 (97,2)x(2,1)显然是一个法律矩阵操作,应该给我一个(97,1)向量

编辑:

我已经纠正了这一点,X.dot(y)但原始问题仍然存在.

DrV*_*DrV 74

dot是矩阵乘法,但*做其他事情.

我们有两个数组:

  • X,形状(97,2)
  • y,形状(2,1)

使用Numpy数组,操作

X * y
Run Code Online (Sandbox Code Playgroud)

以元素方式完成,但可以在一个或多个维度中扩展一个或两个值以使它们兼容.此操作称为广播.尺寸为1或缺少尺寸的尺寸可用于广播.

在上面的示例中,尺寸不兼容,因为:

97   2
 2   1
Run Code Online (Sandbox Code Playgroud)

这里第一维(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
Run Code Online (Sandbox Code Playgroud)

如果您仍然收到此错误,请发布问题的最小示例.使用与您相似的数组的示例乘法成功:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
Run Code Online (Sandbox Code Playgroud)


gob*_*s14 30

Per Wes McKinney的Python数据分析

广播规则:如果对于每个尾随维度(即,从结尾开始),轴长度匹配或者如果长度为1,则两个阵列可用于广播.然后在缺失和/或长度1上执行广播.尺寸.

换句话说,如果你想将两个矩阵相乘(以线性代数意义上的),那么你想要X.dot(y),但如果你想从播出矩阵标量yX,那么你需要执行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]])
Run Code Online (Sandbox Code Playgroud)


iam*_*eit 15

您正在寻找np.matmul(X, y). 在 Python 3.5+ 中,您可以使用X @ y.


kso*_*all 11

这可能是点积中没有出现错误,但之后.例如试试这个

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这个错误具有误导性; 但是那条线上有一个问题.


小智 8

使用np.mat(x) * np.mat(y),那会起作用。