“numpy.add(a,b)”和“a+b”有什么区别?

Man*_*anu 6 numpy scipy array-broadcasting

有什么区别numpy.add(a,b)a+b添加两个ndarrays A和B是什么时候?文档说这numpy.add“在阵列广播方面相当于 x1 + x2”。. 但我不明白这意味着什么,因为numpy.add(numpy.array([1,2,3]),4)也有效。

hpa*_*ulj 8

在 Python 语法中,a+b被转换为a.__add__(b). a.__add__是一种为 类型的对象实现加法的方法a。数字有这样的方法,列表也有([1,3]+[4]),字符串也有('abc'+'d')。

numpy已经为其类(至少对于 numeric )实现了__add__(和其他标准__...方法)。ndarraydtypes

这都是标准的 Python,numpy并且永远存在。

np.add是一个ufunc。查看它的文档 - 查看out参数和Binary ufuncs:部分。这是一个功能,并具备一些方法reducereduceat等:a.__add__(和+)不。

如果您有两个数组或数字,并且想要对它们求和,那么自然是使用+, a+bnp.add在某些特殊情况下很有用

例如,比较两个列表会发生什么:

In [16]: [1,2,3]+[4]
Out[16]: [1, 2, 3, 4]     # default list concatenation
In [17]: np.add([1,2,3],[4])
Out[17]: array([5, 6, 7])   # convert lists to arrays and sum
Run Code Online (Sandbox Code Playgroud)

或使用 2d 广播的示例:

In [19]: np.add([[1],[2],[3]],[4,1])
Out[19]: 
array([[5, 2],
       [6, 3],
       [7, 4]])
In [20]: np.array([1,2,3])[:,None]+np.array([4,1])
Out[20]: 
array([[5, 2],
       [6, 3],
       [7, 4]])
Run Code Online (Sandbox Code Playgroud)

还有你的例子:

In [21]: numpy.add(numpy.array([1,2,3]),4)
Out[21]: array([5, 6, 7])
In [22]: numpy.array([1,2,3])+4
Out[22]: array([5, 6, 7])
Run Code Online (Sandbox Code Playgroud)

“就阵列广播而言,相当于 x1 + x2。” 意味着,他们都工作并做同样的事情。

broadcasting 是另一个主题。

==================

@运营商和np.matmul水货不太一样。该@运营商最近除了Python解释器。它被转换为对__matmul__方法的调用- 如果已定义。新numpy版本有这样的定义。但是该方法不是为 Python 数字或列表定义的。还有一个函数版本,np.matmul,引用相同的代码。还有一个x.dotandnp.dot配对,但没有 Python 识别的运算符或x.__dot__.

  • 一个是 ufunc 而另一个是方法的事实不应该对速度产生影响。那是用户界面问题,而不是速度问题。我使用 `+` 除非我需要 `add` 的附加功能(例如在 `add.reduceat` 中)。 (2认同)