【问题标题】:Taking an average of an array according to another array of indices根据另一个索引数组取一个数组的平均值
【发布时间】:2016-05-26 12:16:31
【问题描述】:

假设我有一个如下所示的数组:

a = np.array([0, 20, 40, 30, 60, 35, 15, 18, 2])

我有一个索引数组,我想在它们之间进行平均:

averaging_indices = np.array([2, 4, 7, 8])

我要做的是根据 averaging_indices 数组对数组 a 的元素进行平均。为了清楚起见,我想取平均值:

np.mean(a[0:2]), np.mean(a[2:4]), np.mean(a[4:7]), np.mean(a[7,8]), np.mean(a[8:])

我想返回一个具有正确尺寸的数组,在这种情况下

result = [10, 35, 36.66, 18, 2]

谁能想到一个巧妙的方法来做到这一点?我能想象的唯一方法是循环,这是非常反 numpy 的。

【问题讨论】:

  • 我认为您应该使用np.mean(a[8:]) 而不是@Divakars np.mean(a[8:-1]) 还是要排除最后一个索引?您只是不想要一个循环还是在这里关注速度?
  • 对不起,我的意思不应该是 ... np.mean(a[7:8]), np.mean(a[8:]) 而不是@MSeifert 也提到的?
  • 另外,np.mean(a[4:7]) 变成了36.66

标签: python arrays numpy mean


【解决方案1】:

这是np.bincount 的矢量化方法-

# Create "shifts array" and then IDs array for use with np.bincount later on
shifts_array = np.zeros(a.size,dtype=int)
shifts_array[averaging_indices] = 1
IDs = shifts_array.cumsum()

# Use np.bincount to get the summations for each tag and also tag counts.
# Thus, get tagged averages as final output.
out = np.bincount(IDs,a)/np.bincount(IDs)

样本输入、输出-

In [60]: a
Out[60]: array([ 0, 20, 40, 30, 60, 35, 15, 18,  2])

In [61]: averaging_indices
Out[61]: array([2, 4, 7, 8])

In [62]: out
Out[62]: array([ 10.        ,  35.        ,  36.66666667,  18.        ,   2.        ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 2020-11-03
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多