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

时间:2016-08-03 15:19:23

标签: numpy scipy numpy-broadcasting

添加两个ndarray a和b时,numpy.add(a,b)a+b之间是否有任何区别? 文档说numpy.addhere。 但我并不知道这意味着什么,因为numpy.add(numpy.array([1,2,3]),4)也有效。

2 个答案:

答案 0 :(得分:3)

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

numpy已为其__add__类实施了__...(以及其他标准ndarray方法)(至少对于数字dtypes)。

这是所有标准的Python和numpy并且永远存在。

np.addufunc。查看其文档 - 请参阅out参数和Binary ufuncs:部分。它是一个函数,并且有一些方法,如reducereduceata.__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__

答案 1 :(得分:0)

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

顺便说一下,我们现在用Python 3.5和numpy看到同样的事情,其中​​矩阵乘法可以由运算符@执行。在此之前,矩阵多个数组只能通过数组的dot()方法完成。

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

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