为什么numpy不允许使用标量进行数组乘法?

3
我假设@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
1个回答

6

@ 是中缀运算符,用于matmul,而不是dot(请注意,两个函数对于高维数组(高于2D)不等效)。

文档中没有明确拒绝标量操作数的原因,但很可能是由PEP 0465引起的动机,该提案最初提出了将@作为Python 3.5中缀运算符的引入。从“语义”部分:

0d(标量)输入会引发错误。标量*矩阵乘法是一种在数学上和算法上不同的操作,与矩阵@矩阵乘法已经被逐元素*运算符覆盖。因此,允许标量@矩阵既需要一个不必要的特例,又违反了TOOWTDI(“只有一种方法可以做到这一点”)。


有趣的是,这个规则更像是Python开发者写的,而不是numpy的。numpy的方法是将标量转换为数组并继续进行。大多数numpy的更改并不受peps的规定。 - hpaulj
我猜测这篇PEP主要是考虑到数值库(尤其是NumPy)的需求而编写的。作者是Nathaniel J. Smith,我认为他经常为NumPy的开发做出贡献。 - Alex Riley
2
@hpaulj:PEP基本上是由numpy开发人员(与其他数值库合作)编写的;python-dev主要是橡皮图章。您可以在底部的参考文献中查看更多历史记录,或者检查上游Python开发人员看到的第一个版本中是否存在该文本 - Nathaniel J. Smith
@NathanielJ.Smith:感谢提供链接!这解答了我最后一个问题。 - Neil G
2
我猜作为进一步的注释,实际内容是:NumPy通常不会随意将标量转换为数组;大多数操作都遵循一些非常简单的确定性规则。dot对标量的处理方式很奇怪——它将标量有效地提升为一个方阵,其中标量在对角线上,其他地方都是零。在NumPy中没有其他像这样模糊的标量->数组提升。那么@应该做dot所做的事情,还是应该广播,或者......什么?没有很好的答案,而且scalar @ matrix也毫无意义(您可以使用*代替),所以我们放弃了。 - Nathaniel J. Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接