我有以下 numpy 陣列(實際上是 pandas 列),它們代表觀察結果(位置和值):
df['x'] = np.array([1, 2, 3, 2, 1, 1, 2, 3, 4, 5])
df['y'] = np.array([2, 1, 1, 1, 1, 1, 1, 1, 3, 2])
相反,我想獲得以下兩個陣列:
[1 2 3 4 5]
[4 3 2 3 2]
這基本上是將 df['x'] 中具有相同值的所有專案分組并獲得 df['y'] 中每個值的累積總和(或者換句話說,獲得每個單獨位置的值的累積總和)。
在 numpy 中實作這一目標的最直接方法是什么?
uj5u.com熱心網友回復:
正如其他人在評論中指出的那樣,如果您已經在使用 pandas,那么在 groupby 上使用 sum 可能是個好主意。話雖如此,如果您堅持使用原始 NumPy,您可以找到的唯一索引,然后在累加器陣列x中總結相應的值:y
import numpy as np
x = np.array([1, 2, 3, 2, 1, 1, 2, 3, 4, 5])
y = np.array([2, 1, 1, 1, 1, 1, 1, 1, 3, 2])
vals, inds = np.unique(x, return_inverse=True)
res = np.zeros_like(vals, dtype=y.dtype)
np.add.at(res, inds, y)
print(res)
# [4 3 2 3 2]
vals是其中的唯一值,x此處并未實際使用。inds是關鍵:這些是 in 的每個值的x索引vals。這些是我們想要從 中累積相應值的結果中的位置y。最后一個技巧是使用np.add.at無緩沖的求和。
結果存盤在res.
uj5u.com熱心網友回復:
我們可以嘗試
def groupby(a, b):
sidx = b.argsort(kind='mergesort')
a_sorted = a[sidx]
b_sorted = b[sidx]
cut_idx = np.flatnonzero(np.r_[True,b_sorted[1:] != b_sorted[:-1],True])
out = [sum(a_sorted[i:j]) for i,j in zip(cut_idx[:-1],cut_idx[1:])]
return out
groupby(df['y'].values,df['x'].values)
Out[223]: [4, 3, 2, 3, 2]
請注意原始功能,您可以參考 Divakar 的回答(再次感謝 Divakar :-),教我顛簸)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429372.html
