I have a numpy matrix `A`

where the data is organised column-vector-vise i.e `A[:,0]`

is the first data vector, `A[:,1]`

is the second and so on. I wanted to know whether there was a more elegant way to zero out the mean from this data. I am currently doing it via a `for`

loop:

mean=A.mean(axis=1) for k in range(A.shape[1]): A[:,k]=A[:,k]-mean

So does numpy provide a function to do this? Or can it be done more efficiently another way?

## Answer

As is typical, you can do this a number of ways. Each of the approaches below works by adding a dimension to the `mean`

vector, making it a 4 x 1 array, and then NumPy’s broadcasting takes care of the rest. Each approach creates a view of `mean`

, rather than a deep copy. The first approach (i.e., using `newaxis`

) is likely preferred by most, but the other methods are included for the record.

In addition to the approaches below, see also ovgolovin’s answer, which uses a NumPy matrix to avoid the need to reshape `mean`

altogether.

For the methods below, we start with the following code and example array `A`

.

import numpy as np A = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) mean = A.mean(axis=1)

# Using `numpy.newaxis`

>>> A - mean[:, np.newaxis] array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]])

# Using `None`

The documentation states that `None`

can be used instead of `newaxis`

. This is because

>>> np.newaxis is None True

Therefore, the following accomplishes the task.

>>> A - mean[:, None] array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]])

That said, `newaxis`

is clearer and should be preferred. Also, a case can be made that `newaxis`

is more future proof. See also: Numpy: Should I use newaxis or None?

# Using `ndarray.reshape`

>>> A - mean.reshape((mean.shape[0]), 1) array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]])

# Changing `ndarray.shape`

directly

You can alternatively change the shape of `mean`

directly.

>>> mean.shape = (mean.shape[0], 1) >>> A - mean array([[-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.], [-1., 0., 1.]])