我有像这样的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]])
答案 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
然后通过将第一列分组并通过groupby
将aggregating
分组(使用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]])