【问题标题】:How to insert values into numpy array with groupby summation如何使用 groupby 求和将值插入 numpy 数组
【发布时间】:2021-02-04 03:02:51
【问题描述】:

我有一个空的 numpy 数组a,一个包含应该插入的值的数组v,以及一个包含索引的数组,这些值应该插入到i。我想使用索引i 将数组v 中的值插入数组a。当i 中的值是唯一的时,只需a[i] = v 即可完成。

如果i 中的值有重复项并且我想计算重复项的总和,该怎么办?

如果i 中的索引重复,则仅使用i 中的最后一次出现:

from numpy import *
a = zeros(5)
i = array([1, 1, 2, 3])
v = array([10, 20, 30, 40])
a[i] = v
print(a) # [ 0. 20. 30. 40.  0.]

i 上的循环有效,但速度很慢:

for j1, j2 in enumerate(i):
    a[j2] += v[j1]
print(a) # [ 0. 30. 30. 40.  0.]

迭代搜索、使用和删除 i 中唯一值的算法对于这个简单的任务来说太复杂了。

如何在没有循环的情况下进行求和?

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

    @Anton 提出的答案非常好。您还可以将np.bincount 与权重一起使用,这是为此目的的内置函数:

    a = np.bincount(i,v,minlength=5)
    #[ 0. 30. 30. 40.  0.]
    

    等效的 pandas groupby 解决方案:

    df = pd.DataFrame(v).groupby(i).sum()
    a[df.index] = df.to_numpy().flatten()
    #[ 0. 30. 30. 40.  0.]
    

    您也可以使用np.diffnp.searchsorted 来实现此目标。我发现上面的那些更具可读性。

    【讨论】:

      【解决方案2】:

      这里有一个类似的问题: Add multiple values to one numpy array index

      答案是:

      add.at(a, i, v)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-06
        • 1970-01-01
        • 2015-08-24
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多