5

现在我正在通过迭代来做到这一点,但必须有一种方法可以使用 numpy 函数来完成这项任务。我的目标是一次获取一个二维数组和平均 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 的输入数组,我将平均前两列,然后是最后三列。

你能提供的任何帮助都会很棒。

4

2 回答 2

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]])
于 2013-01-18T14:40:23.603 回答
1

首先,在我看来,您根本没有对列进行平均,您只是一次平均两个数据点。在我看来,你最好的办法是重塑数组,所以你有一个 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.        ]])
于 2013-01-18T14:40:57.243 回答