Remove mean from numpy matrix

后端 未结 4 1287
渐次进展
渐次进展 2021-02-07 02:47

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

4条回答
  •  花落未央
    2021-02-07 03:11

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

提交回复
热议问题