When arrays need to be manipulated by mathematical operations, you just need to apply the operation on the array with respect to a numerical constant (a scalar) or an array of the exact same shape:

In: import numpy as npIn: a = np.arange(5).reshape(1,5)In: a += 1In: a*aOut: array([[ 1, 4, 9, 16, 25]])

The result will be that the operation will be performed element-wise, that is, every element of the array is operated by either the scalar value or the corresponding element of the other array.

When operating on arrays of different dimensions, it is still possible to obtain element-wise operations without having to restructure the data in case one of the corresponding dimensions is 1. In fact, in such a case, the dimension of size 1 is stretched until it matches the dimension of the corresponding array. This conversion is called *broadcasting*.

For instance:

In: a = np.arange(5).reshape(1,5) + 1b = np.arange(5).reshape(5,1) + 1a * bOut: array([[ 1...