np.dot不是很好
正如多米尼克·保罗(Dominique
Paul)所指出的那样,
np.dot根据输入的形状,它们的行为非常不同。正如OP在他的问题中指出的那样,给人带来的困惑是,它
weights是一维数组,
np.array_equal(weights,weights.T)即
True(
array_equal测试值和形状是否相等)。建议:使用
np.matmul或同等
@替代
如果您是刚开始使用Numpy的人,我对您的建议是
np.dot完全放弃。根本不要在代码中使用它。而是使用
np.matmul或等效运算符
@。的行为
@比的行为更可预测
np.dot,同时仍易于使用。例如,对于
1D代码中的两个数组,您将获得相同的点积,如下所示:
returns = expected_returns_annual @ weights
您可以向自己证明,它给出的答案
np.dot与此相同
assert:
assert expected_returns_annual @ weights == expected_returns_annual.dot(weights)
从概念上讲,
@通过将两个
1D数组提升为适当的
2D数组来处理这种情况(尽管实现不一定要这样做)。例如,如果您具有
xwith
(N,)和
yshape
(M,),则如果使用,则会
x @ y将形状提升为:
x.shape == (1, N)y.shape == (M, 1)
matmul/的完整行为
@
这是文档关于
matmul/
@和输入/输出形状的说明:
注意:使用
@over的参数
dot
作为hpaulj的评论,指出
np.array_equal(x.dot(y), x @y)所有
x和
y那些
1D或
2D阵列。那么,为什么我(以及您为什么要)更喜欢
@?我认为使用的最佳论据
@是它有助于以小而有意义的方式改进您的代码:
@
明确地是矩阵乘法运算符。x @ y
如果y
是标量,将产生错误,而dot
将假设您实际上只是想要元素乘法。这可能会导致难以定位的错误,在该错误中dot
默默地返回垃圾结果(我亲自遇到了该错误)。因此,@
允许您明确说明自己对代码行行为的意图。因为
@
是运算符,所以它具有一些不错的简短语法,用于将各种序列类型强制转换为数组,而不必显式转换它们。例如,[0,1,2] @ np.arange(3)
有效语法。- 公平地说,虽然
[0,1,2].dot(arr)
显然无效,np.dot([0,1,2], arr)
但是有效(尽管比使用更加冗长@
)。 - 当确实需要扩展代码以处理许多矩阵乘法而不是仅处理一次时,这种
ND
情况@
在概念上是小写的简单直观的泛化/向量化D
。
- 公平地说,虽然
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)