在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
(请注意,如果X和y是类型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),但如果你想从播出矩阵标量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]])
Run Code Online (Sandbox Code Playgroud)
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)
这个错误具有误导性; 但是那条线上有一个问题.