Так что это грубый ответ, основанный на методе diff
, который я упоминал в комментариях. Обратите внимание, что, поскольку вам нужна операция agg, основанная на группах, нет верного способа действительно векторизовать ее эффективным образом. Кроме того, в этом примере предполагается, что ваши данные отсортированы, мы вернемся к нему позже.
def reduce(x): return np.r_[x[:,:-1].sum(axis=0), x[0,-1]]
x = np.array([[ 1, 2, 3, 4, 0 ],
[ 5, 1, 0, 1, 1 ],
[ 0, 1, 0, 1, 1 ],
[ 1, 0, 3, 0, 2 ],
[ 1, 1, 2, 6, 2 ],
[ 0, 1, 0, 2, 2 ] ])
ind = np.where(np.diff(x[:,-1], prepend=x[0,-1]))[0]
x_agg = np.array([reduce(i) for i in np.split(x, ind)])
Код прост, он находит индексы, где значения последней строки изменились, разбивает массив в этих местах и агломерирует его, как вы хотите.
Теперь, если данные не отсортированы в последней строке, возникают два случая:
- Элементы с одинаковым целевым значением рядом друг с другом. Это должно быть хорошо, так как поведение diff будет таким же (возможно, придется добавить условие, например
np.where(np.diff(...)!=0)
- Те же значения цели разбросаны, тогда порядок не должен иметь значения, так как нет логического способа сопоставления их после агломерации.
Надеюсь, это поможет.