Manu
Manu

Reputation: 283

What's the difference between "numpy.add(a,b)" and "a+b"?

Is there any difference between numpy.add(a,b) and a+b when adding two ndarrays a and b? The documentation says that numpy.add is the "Equivalent to x1 + x2 in terms of array broadcasting.". But I don't unserstand what this means, since numpy.add(numpy.array([1,2,3]),4) also works.

Upvotes: 9

Views: 7404

Answers (2)

hpaulj
hpaulj

Reputation: 231365

In Python syntax, a+b is translated to a.__add__(b). a.__add__ is a method that implements addition for objects of type a. A number has such a method, a list does as well ([1,3]+[4]) and so does a string ('abc'+'d').

numpy has implemented __add__ (and other standard __... methods) for its ndarray class (at least for the numeric dtypes).

That's all standard Python and numpy and been around for ever.

np.add is a ufunc. Look at its doc - see the out parameter, and the Binary ufuncs: section. It's a function, and has some methods like reduce, reduceat, etc that a.__add__ (and +) does not.

If you have two arrays or numbers and you want to sum them, the natural thing is to use +, a+b. np.add is useful in some special cases

Compare, for example, what happens to two lists:

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

or an example using 2d broadcasting:

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

And your example:

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

"Equivalent to x1 + x2 in terms of array broadcasting." means, they both work and do the same thing.

broadcasting is another subject.

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

The @ operator and np.matmul parallel isn't quite the same. The @ operator is a recent addition to the Python interpreter. It is translated to a call to the __matmul__ method - if defined. New numpy versions have such a definition. But the method is not defined for Python numbers or lists. There is also a function version, np.matmul, referencing the same code. There is also a x.dot and np.dot pairing, but no Python recognized operator or x.__dot__.

Upvotes: 11

Israel Unterman
Israel Unterman

Reputation: 13510

I believe that add() was first, the the library improved and gained normal mathematical operators.

BTW, we witness the same thing now with Python 3.5 and numpy, where matrix multiplication can be performed by the operator @. Prior to that, matrix mult of arrays could be done only by the dot() method of the array.

Broadcasting means the ability to perform operations between arrays of different sizes, like adding a number to a whole array. This works with operators on arrays as well.

Adding a number to an array is only a tiny example of the broadcasting ability. You can read more about it in Broadcasting It's a very cool feature which saves memory and coding, but not so easy to understand at first reading.

Upvotes: 0

Related Questions