有效地对numpy数组重复行进行平均

时间:2018-08-07 23:31:19

标签: python numpy duplicates

我有像这样的numpy数组:

old=([[5.00000000e+00, 3.39622642e-03],
       [5.00000000e+00, 5.84905660e-04],
       [1.00000000e+01, 4.15094340e-04],
       [1.50000000e+01, 2.26415094e-03],
       [2.00000000e+01, 4.90566038e-02],
       [2.50000000e+01, 4.90566038e-01],
       [3.00000000e+01, 4.90566038e-01],
       [4.00000000e+01, 8.11320755e-01],
       [4.00000000e+01, 1.00000000e+00]])

其中第一列是深度,第二列是一些度量。我需要高效地(尽可能多地快速)对重复行(具有相同深度的行)进行平均测量,并用新的计算出的平均值替换旧行,如下所示:

new=([[5.00000000e+00, 1.99056600e-03],
       [1.00000000e+01, 4.15094340e-04],
       [1.50000000e+01, 2.26415094e-03],
       [2.00000000e+01, 4.90566038e-02],
       [2.50000000e+01, 4.90566038e-01],
       [3.00000000e+01, 4.90566038e-01],
       [4.00000000e+01, 9.05660377e-01]])

2 个答案:

答案 0 :(得分:2)

IIUC,您可以使用pandas来处理此数据。

df = pd.DataFrame(old)

给予

    0       1
0   5.0     0.003396
1   5.0     0.000585
2   10.0    0.000415
3   15.0    0.002264
4   20.0    0.049057
5   25.0    0.490566
6   30.0    0.490566
7   40.0    0.811321
8   40.0    1.000000

然后通过将第一列分组并通过groupbyaggregating分组(使用mean.mean()来利用.agg('mean')。最后,访问您的{{ 1}}来返回.values及其结果值

np.array

答案 1 :(得分:1)

这当然不是矢量化的,但是可以像这样获得具有列表理解的纯numpy方式:

new = np.stack([np.mean(old[np.where(old[:,0] == i)], axis=0) for i in np.unique(old[:,0])])


>>> new
array([[5.00000000e+00, 1.99056604e-03],
       [1.00000000e+01, 4.15094340e-04],
       [1.50000000e+01, 2.26415094e-03],
       [2.00000000e+01, 4.90566038e-02],
       [2.50000000e+01, 4.90566038e-01],
       [3.00000000e+01, 4.90566038e-01],
       [4.00000000e+01, 9.05660378e-01]])