np.dot是否会自动转置向量?

np.dot是否会自动转置向量?,第1张

np.dot是否会自动转置向量? 的语义
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
数组来处理这种情况(尽管实现不一定要这样做)。例如,如果您具有
x
with
(N,)
y
shape
(M,)
,则如果使用,则会
x @ y
将形状提升为:

x.shape == (1, N)y.shape == (M, 1)
matmul
/的完整行为
@

这是文档关于

matmul
/
@
和输入/输出形状的说明:

  • 如果两个参数都是二维的,它们将像常规矩阵一样相乘。
  • 如果任一自变量的值为ND,N> 2,则将其视为驻留在最后两个索引中的矩阵的堆栈,并进行相应广播。
  • 如果第一个参数是1-D,则通过在其尺寸前面加1来将其提升为矩阵。矩阵相乘后,除去前面的1。
  • 如果第二个参数是1-D,则通过在其维数后附加1来将其提升为矩阵。矩阵相乘后,将附加的1删除。

注意:使用
@
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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5631500.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存