NumPy - Векторизация привязки по столбцу 2D-массива с весами - PullRequest
1 голос
/ 03 февраля 2020

Я искал решения здесь и здесь , но не смог понять, как я могу применить его к своим структурам.

У меня есть 3 массива: (M, N) нулей и (P,) индексов (некоторые повторяются) и (P, N) значений.

Я могу выполнить sh это с помощью oop:

# a: (M, N)
# b: (P, N)
# ix: (M,)
for i in range(N):
    a[:, i] += np.bincount(ix, weights=b[:, i], minlength=M)

Я не видел примеров, использующих индексы таким образом или с ключевым словом weights. Я понимаю, что мне нужно собрать все в одномерный массив, чтобы векторизовать его, но я изо всех сил пытаюсь выяснить, как этого добиться.

1 Ответ

0 голосов
/ 03 февраля 2020
Идея

Basi c остается той же, что обсуждалась в некоторых деталях в этих связанных сообщениях, т. Е. Создается массив бинов 2D со смещениями для "1D-данных", которые нужно обработать (в данном случае на столбец). Итак, имея в виду, мы получим что-то вроде этого -

# Extent of bins per col
n = ix.max()+1

# 2D bins for per col processing
ix2D = ix[:,None] + n*np.arange(b.shape[1])

# Finally use bincount with those 2D bins as flattened and with
# flattened b as weights. Reshaping is needed to add back into "a".
a[:n] += np.bincount(ix2D.ravel(), weights=b.ravel(), minlength=n*N).reshape(N,-1).T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...