numpy为什么不允许scalars进行数组乘法?

Nei*_*l G 3 python numpy matrix-multiplication python-3.x

我认为这@是该dot方法的简写.什么促使设计决定阻止具有形状的阵列的乘法()?

In [6]: a = np.ones((2,1))

In [7]: a.dot(1)
Out[7]:
array([[ 1.],
       [ 1.]])

In [8]: a @ 1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-398cff4c0ec9> in <module>()
----> 1 a @ 1

ValueError: Scalar operands are not allowed, use '*' instead
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 6

@是中缀运算符matmul,而不是dot(请注意,这两个函数不等同于更高维数组(高于2D)).

在文档中没有明确说明拒绝标量作为操作数的原因,但似乎很可能这个动机源自PEP 0465,它最初提出引入@作为Python 3.5的中缀运算符.从'语义'部分:

0d(标量)输入引发错误.标量*矩阵乘法是一种在数学上和算法上与矩阵@矩阵乘法不同的运算,并且已经由元素*运算符覆盖.@因此,允许标量矩阵都需要一个不必要的特殊情况,并且违反了TOOWTDI ["只有一种方法可以做到"].

  • @hpaulj:PEP几乎是由numpy开发人员编写的(与其他数值库合作); python-dev主要是橡皮图章.您可以在[底部的参考资料](http://legacy.python.org/dev/peps/pep-0465/#discussions-of-this-pep)中查看更多历史记录,或者[查看该文本出现在上游python开发人员看到的第一个版本中](https://mail.python.org/pipermail/python-ideas/2014-March/027053.html). (2认同)
  • 我想作为实际内容的另一个注意事项:-):numpy一般不会只是将标量变成数组而且不知道; 大多数操作遵循一些非常简单的确定性规则."点"对标量的作用很奇怪 - 它有效地将标量提升为方形矩阵,对角线上的标量和其他地方的零点.numpy中没有其他标量 - >数组促销甚至模糊不清.```做什么`dot`做什么,它应该广播,还是......什么?没有很好的答案,"标量@矩阵"无论如何都是毫无意义的(你可以使用`*`代替),所以我们就会受到惩罚. (2认同)