【问题标题】:averaging numpy array duplicate rows efficiently有效地平均numpy数组重复行
【发布时间】:2018-08-08 07:41:06
【问题描述】:

我有这样的 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]])

【问题讨论】:

  • 你的数组长度真的应该改变吗?
  • 不一定。但我不希望额外的数据点为零。我认为 NaN 很好,因为它没有被绘制出来。

标签: python numpy duplicates


【解决方案1】:

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

然后只需通过将第一列和aggregating 分组到mean 来利用groupby(使用.mean().agg('mean')。最后,访问您的.values 以获取np.array 与结果值

df.groupby(0).mean().reset_index().values

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]])

【讨论】:

  • 像魅力一样工作。谢谢
  • @Bob 很高兴我能帮上忙 :) 如果您认为这有帮助,请接受答案
【解决方案2】:

这当然不是向量化的,但是可以像这样获得带有列表理解的纯 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]])

【讨论】:

  • 这也可以,但是可以转换为 pandas 并将其返回。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2011-06-05
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
相关资源
最近更新 更多