6

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

4

2 回答 2

9

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

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

这都是标准的 Python,numpy并且一直存在。

np.add是一个ufunc。查看它的文档 - 查看out参数和Binary ufuncs:部分。它是一个函数,并且有一些(和)没有的方法,如reduce,reduceat等。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

或使用 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]])

你的例子:

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])

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

broadcasting是另一个主题。

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

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

于 2016-08-03T16:59:32.390 回答
0

我相信add()首先,图书馆改进并获得了正常的数学运算符。

顺便说一句,我们现在用 Python 3.5 和 numpy 见证了同样的事情,其中​​矩阵乘法可以由 operator 执行@。在此之前,矩阵多数组只能通过dot()数组的方法来完成。

广播意味着能够在不同大小的数组之间执行操作,例如将一个数字添加到整个数组中。这也适用于数组上的运算符。

向数组添加数字只是广播能力的一个小例子。您可以在广播中阅读更多关于它的信息。 这是一个非常酷的功能,可以节省内存和编码,但在第一次阅读时并不那么容易理解。

于 2016-08-03T15:31:07.053 回答