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)也有效。
在 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:部分。这是一个功能,并具备一些方法reduce,reduceat等:a.__add__(和+)不。
如果您有两个数组或数字,并且想要对它们求和,那么自然是使用+, a+b。 np.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__.