现在我通过迭代来做这个,但必须有一种方法来使用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的输入数组,我将平均前两列,然后是最后三列。
您可以提供任何帮助都很棒。
答案 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. ]])