When operating on two arrays, NumPy compares their shapes element-wise. It starts with the trailing dimensions, and works its way forward. Two dimensions are compatible when:
>>> 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]])
dot
是矩阵乘法,但是*
做了其他事情。我们有两个阵列:
X
,形状(97,2)y
,形状(2,1)对于Numpy数组,操作
是按元素执行的,但可以在一个或多个维度中展开其中一个或两个值,以使它们兼容。这个操作叫做广播。尺寸为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
,则会出现不同的异常:如果你仍然得到这个错误,请张贴一个最小的问题的例子。一个使用类似于您的数组的乘法示例成功:
这个错误可能不是在点积中发生的,而是在点积之后。 例如,试试这个
np.dot(a,b)可以;但是np.dot(a,b)*c显然是错误的(12x1x1x1x5=12x5,不能按元素相乘5x12),但是numpy会给你
这一错误是误导性的;然而,这方面存在一个问题。
每numpy docs:
换言之,如果您尝试将两个矩阵相乘(在线性代数意义上),则需要
X.dot(y)
,但如果您尝试将标量从矩阵y
广播到X
,则需要执行X * y.T
。示例:
相关问题 更多 >
编程相关推荐