Обновление массива numy с разреженными индексами и значениями - PullRequest
0 голосов
/ 28 октября 2018

У меня есть одномерный массив NumPy и я хочу хранить его редкие обновления.Скажем, у меня есть массив длиной 500000 и я хочу сделать 100 обновлений по 100 элементов.Обновления - это либо добавление, либо просто изменение значений (я не думаю, что это имеет значение).

Каков наилучший способ сделать это, используя numpy?Я хотел просто сохранить два массива: индексы, values_to_add и, следовательно, иметь два объекта: один хранит плотную матрицу, а другой просто сохраняет индексы и значения для добавления, и я могу просто сделать что-то подобное с плотной матрицей:

dense_matrix[indices] += values_to_add

И если у меня есть несколько обновлений, я просто конкатирую их.

Но этот тупой синтаксис не работает нормально с повторяющимися элементами: они просто игнорируются.

Обновление пары, когда мы имеемобновление, которое повторяет индекс, является O (n).Я думал об использовании dict вместо массива для хранения обновлений, который с точки зрения сложности выглядит неплохо, но выглядит не очень хорошо.

Какой самый выразительный способ добиться этого?Я знаю о скудных разреженных объектах, но (1) я хочу чисто наглую, потому что (2) я хочу понять, как наиболее эффективно реализовать это.

1 Ответ

0 голосов
/ 28 октября 2018

Если у вас есть повторяющиеся индексы, вы можете использовать в , из документации:

Выполняет небуферизованную операцию на месте с операндом 'a' для элементов, указанных в 'индексах'.Для сложения ufunc этот метод эквивалентен a [indexes] + = b, за исключением того, что результаты накапливаются для элементов, которые проиндексированы более одного раза.

Код

a = np.arange(10)
indices = [0, 2, 2]
np.add.at(a, indices, [-44, -55, -55])
print(a)

Выход

[ -44    1 -108    3    4    5    6    7    8    9]
...