# Remove mean from numpy matrix

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?

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