换句话说,如果你试图乘以两个矩阵(在线性代数意义上),那么你想要 X.dot(y) 但是如果你试图将矩阵 y 中的标量广播到 X 那么你需要执行 X * y.T .
Example:
>>> 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]])
23
这可能是点积中没有出现错误,但之后 . 例如试试这个
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)
4 回答
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
的形状错误,则会出现另外的异常:如果您仍然收到此错误,请发布问题的最小示例 . 使用与您相似的数组的示例乘法成功:
Per Wes McKinney的Python for Data Analysis
换句话说,如果你试图乘以两个矩阵(在线性代数意义上),那么你想要
X.dot(y)
但是如果你试图将矩阵y
中的标量广播到X
那么你需要执行X * y.T
.Example:
这可能是点积中没有出现错误,但之后 . 例如试试这个
np.dot(a,b)没问题;但是np.dot(a,b)* c显然是错误的(12x1 X 1x5 = 12x5,它不能在元素方面乘以5x12)但是numpy会给你
这个错误具有误导性;但是那条线上有一个问题 .
使用np.mat(x)* np.mat(y),这将起作用 .