Numpy накапливает один массив в другом, используя индексный массив - PullRequest
11 голосов
/ 20 марта 2012

Мой вопрос касается конкретной операции с массивом, которую я хочу выразить с помощью numpy.

У меня есть массив с плавающей точкой w и массив индексов idx той же длины, что и wи я хочу суммировать все w с одним и тем же значением idx и собрать их в массив v.Как цикл, это выглядит так:

for i, x in enumerate(w):
     v[idx[i]] += x

Есть ли способ сделать это с помощью операций с массивами?Мое предположение было v[idx] += w, но это не работает, поскольку idx содержит один и тот же индекс несколько раз.

Спасибо!

Ответы [ 2 ]

15 голосов
/ 20 марта 2012

numpy.bincount было введено для этой цели:

tmp = np.bincount(idx, w)
v[:len(tmp)] += tmp

Я думаю, что с 1.6 вы также можете передать минимальную длину bincount.

4 голосов
/ 20 марта 2012

Это известное поведение, хотя и несколько неудачное, но не имеет обходного пути.(bincount может быть использовано для этого, если вы закрутите его руку.) Самым лучшим вариантом будет сделать цикл самостоятельно.

Обратите внимание, что ваш код мог бы быть немного более четким без повторного использования имени w и без введения другого набора индексов, таких как

for i, w_thing in zip(idx, w):
    v[i] += w_thing

Если вам нужно ускорить этот цикл, вам, возможно, придется перейти к C. Cython делает это относительно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...