从numpy矩阵中删除均值

pra*_*km 21 python numpy

我有一个numpy矩阵A,其中数据组织为column-vector-vise,即A[:,0]第一个数据向量,A[:,1]是第二个,依此类推.我想知道是否有一种更优雅的方法可以将这些数据归零.我目前通过for循环执行此操作:

mean=A.mean(axis=1)
for k in range(A.shape[1]):
    A[:,k]=A[:,k]-mean
Run Code Online (Sandbox Code Playgroud)

那么numpy提供了这样做的功能吗?或者它可以通过另一种方式更有效地完成吗?

Dav*_*ber 33

通常,您可以通过多种方式执行此操作.下面的每种方法都通过向mean向量添加维度,使其成为4 x 1阵列,然后NumPy的广播处理其余的.每种方法都会创建一个视图mean,而不是深层副本.第一种方法(即使用newaxis)可能是大多数人喜欢的,但其他方法也包含在记录中.

除了下面的方法,还可以参见ovgolovin的答案,它使用NumPy矩阵来避免mean完全重塑形状.

对于下面的方法,我们从以下代码和示例数组开始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)
Run Code Online (Sandbox Code Playgroud)

运用 numpy.newaxis

>>> A - mean[:, np.newaxis]
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.]])
Run Code Online (Sandbox Code Playgroud)

运用 None

文件,各国None可以用来代替newaxis.这是因为

>>> np.newaxis is None
True
Run Code Online (Sandbox Code Playgroud)

因此,以下完成任务.

>>> A - mean[:, None]
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.]])
Run Code Online (Sandbox Code Playgroud)

那说,newaxis更清楚,应该是首选.此外,可以制作newaxis更具前瞻性的案例.另见:Numpy:我应该使用newaxis还是None?

运用 ndarray.reshape

>>> A - mean.reshape((mean.shape[0]), 1)
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.]])
Run Code Online (Sandbox Code Playgroud)

ndarray.shape直接改变

您也可以mean直接更改形状.

>>> mean.shape = (mean.shape[0], 1)
>>> A - mean
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.]])
Run Code Online (Sandbox Code Playgroud)

  • 在NumPy中表达这种重塑的通常方法是使用[`np.newaxis`](http://www.scipy.org/Numpy_Example_List#newaxis):`A - mean [:,np.newaxis]`. (2认同)

ovg*_*vin 7

您也可以使用matrix而不是array.那你就不需要重塑了:

>>> A = np.matrix([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
>>> m = A.mean(axis=1)
>>> A - m
matrix([[-1.,  0.,  1.],
        [-1.,  0.,  1.],
        [-1.,  0.,  1.],
        [-1.,  0.,  1.]])
Run Code Online (Sandbox Code Playgroud)


Ste*_*joa 5

是.pylab.demean:

In [1]: X = scipy.rand(2,3)

In [2]: X.mean(axis=1)
Out[2]: array([ 0.42654669,  0.65216704])

In [3]: Y = pylab.demean(X, axis=1)

In [4]: Y.mean(axis=1)
Out[4]: array([  1.85037171e-17,   0.00000000e+00])
Run Code Online (Sandbox Code Playgroud)

资源:

In [5]: pylab.demean??
Type:           function
Base Class:     <type 'function'>
String Form:    <function demean at 0x38492a8>
Namespace:      Interactive
File:           /usr/lib/pymodules/python2.7/matplotlib/mlab.py
Definition:     pylab.demean(x, axis=0)
Source:
def demean(x, axis=0):
    "Return x minus its mean along the specified axis"
    x = np.asarray(x)
    if axis == 0 or axis is None or x.ndim <= 1:
        return x - x.mean(axis)
    ind = [slice(None)] * x.ndim
    ind[axis] = np.newaxis
    return x - x.mean(axis)[ind]
Run Code Online (Sandbox Code Playgroud)


小智 5

看起来其中一些答案相当旧,我刚刚在 numpy 1.13.3 上测试了这个:

>>> import numpy as np
>>> a = np.array([[1,1,3],[1,0,4],[1,2,2]])
>>> a
array([[1, 1, 3],
       [1, 0, 4],
       [1, 2, 2]])
>>> a = a - a.mean(axis=0)
>>> a
array([[ 0.,  0.,  0.],
       [ 0., -1.,  1.],
       [ 0.,  1., -1.]])
Run Code Online (Sandbox Code Playgroud)

我认为这更干净、更简单。尝试一下,让我知道这是否比其他答案差。