Numpy - 平均2D阵列的多个列

时间:2013-01-18 14:30:02

标签: python numpy

现在我通过迭代来做这个,但必须有一种方法来使用numpy函数完成这个任务。我的目标是一次获取一个2D数组并平均J列,生成一个与原始行数相同的新数组,但是使用列/ J列。

所以我想接受这个:

J = 2 // two columns averaged at a time

[[1 2 3 4]
 [4 3 7 1]
 [6 2 3 4]
 [3 4 4 1]]

并产生这个:

[[1.5 3.5]
 [3.5 4.0]
 [4.0 3.5]
 [3.5 2.5]]

有没有简单的方法来完成这项任务?我还需要一种方法,如果我永远不会得到一个不平衡的余数列。因此,例如,如果我有一个包含5列且J = 2的输入数组,我将平均前两列,然后是最后三列。

您可以提供任何帮助都很棒。

2 个答案:

答案 0 :(得分:4)

data.reshape(-1,j).mean(axis=1).reshape(data.shape[0],-1)

如果您的j除以data.shape[1],那就是。

示例:

In [40]: data
Out[40]: 
array([[7, 9, 7, 2],
       [7, 6, 1, 5],
       [8, 1, 0, 7],
       [8, 3, 3, 2]])

In [41]: data.reshape(-1,j).mean(axis=1).reshape(data.shape[0],-1)
Out[41]: 
array([[ 8. ,  4.5],
       [ 6.5,  3. ],
       [ 4.5,  3.5],
       [ 5.5,  2.5]])

答案 1 :(得分:1)

首先,在我看来,你根本就没有对列进行平均,你一次只能平均两个数据点。在我看来,您最喜欢的是reshaping数组,因此您可以使用Nx2数据结构直接提供给mean。如果列数不相容,则可能必须先填充它。然后在最后,只需对填充的剩余列和前一列进行加权平均。最后重塑回你想要的形状。

播放TheodrosZelleke提供的例子:

In [1]: data = np.concatenate((data, np.array([[5, 6, 7, 8]]).T), 1)

In [2]: data
Out[2]: 
array([[7, 9, 7, 2, 5],
       [7, 6, 1, 5, 6],
       [8, 1, 0, 7, 7],
       [8, 3, 3, 2, 8]])

In [3]: cols = data.shape[1]

In [4]: j = 2

In [5]: dataPadded = np.concatenate((data, np.zeros((data.shape[0], j - cols % j))), 1)

In [6]: dataPadded
Out[6]: 
array([[ 7.,  9.,  7.,  2.,  5.,  0.],
       [ 7.,  6.,  1.,  5.,  6.,  0.],
       [ 8.,  1.,  0.,  7.,  7.,  0.],
       [ 8.,  3.,  3.,  2.,  8.,  0.]])

In [7]: dataAvg = dataPadded.reshape((-1,j)).mean(axis=1).reshape((data.shape[0], -1))

In [8]: dataAvg
Out[8]: 
array([[ 8. ,  4.5,  2.5],
       [ 6.5,  3. ,  3. ],
       [ 4.5,  3.5,  3.5],
       [ 5.5,  2.5,  4. ]])

In [9]: if cols % j:
    dataAvg[:, -2] = (dataAvg[:, -2] * j + dataAvg[:, -1] * (cols % j)) / (j + cols % j)
    dataAvg = dataAvg[:, :-1]
   ....:     

In [10]: dataAvg
Out[10]: 
array([[ 8.        ,  3.83333333],
       [ 6.5       ,  3.        ],
       [ 4.5       ,  3.5       ],
       [ 5.5       ,  3.        ]])