У меня есть разреженный массив вроде следующего:
import scipy
my_sparse_array = scipy.sparse.random(2000, 1000000, density=0.01, format='csr')
И для каждой строки у меня есть группа: groups = ["A", "A", "B", "C", "D"] * 400
Основываясь на этих группах, я хочу получить сумму каждого столбца и вывести массив, в котором строки теперь будут общей суммой группы, а каждый столбец останется прежним.
Как это можно эффективно сделать с разреженной матрицей?
Спасибо, Джек
Обновлено:
Один из способов сделать это может заключаться в следующем:
import numpy as np
import pandas as pd
results = {}
group_set = set(groups)
for group in group_set:
indices = np.where(np.array(groups) == group)[0]
results[group] = my_sparse_array[indices, :].sum(axis=0).A1
final_result = pd.DataFrame(results)
Однако мне было интересно, есть ли более эффективный способ, кроме цикла по группам и подмножествам.
Покажите нам, как бы вы сделали эту группировку для небольшой матрицы (и группы). Он мог бы быть плотным, если бы это было проще. И для начала не беспокойтесь об эффективности. Сначала нам нужна четко определенная задача.
@hpaulj Привет, спасибо за комментарий. Я обновил вопрос, предложив решение, которое, вероятно, не является оптимальным. Если вы можете помочь улучшить это, мы будем признательны. Спасибо!
Несколько итераций, например 5, со сложной задачей, такой как индексация и суммирование большой разреженной матрицы, не является неэффективным. В numpy мы стараемся избегать множества повторений простой задачи.






Я не совсем понимаю. но вы можете легко сделать
my_sparse_array[:, 0::5].sum(axis=0)и т. д. Поскольку и индексация, и сумма реализованы как умножение матриц, можно было бы построить подходящую матрицу, чтобыmy_sparse_array * Mдавал желаемый результат (по крайней мере, для одной группы за раз). Как бы вы это ни делали, я думаю, вам придется перебирать группы, чтобы получить полный набор.