2015-05-16 3 views
2

Я строю scipy разреженная матрица S с sklearn.preprocessing.OneHotEncoder(). Матрица S имеет 10^6 строк для 500 столбцов.groupby на разреженной матрице с scipy

У меня также есть numpy массив A с 10^6 значений следующим образом:

A = [1,1,2,2,2,3,4,5,6,6,7,8,8,8,...] 

Я хочу сделать группу, на разреженную матрицу S следующих групп, написанных в массиве A и использовать numpy.sum() как функция агрегации.

Как я могу это сделать? Конечно, мне все нужно поместиться в память, поэтому я вынужден использовать разреженную матрицу для S.

+0

Продемонстрируйте, что вы хотите сделать с помощью пары небольших массивов. Тогда мы можем думать о том, как его можно адаптировать к разреженной. – hpaulj

ответ

2

Если индексы увеличиваются (как видно из вашего примера), вы можете использовать itertools.groupby на enumerate списка. Для каждой группы используйте numpy's indexing.

Петля может выглядеть следующим образом:

import itertools 
import operator 

for g, inds in itertools.groupby(enumerate(A), key=operator.itemgetter(1)): 
    ... 

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

for g, inds in itertools.groupby(enumerate(A), key=operator.itemgetter(1)): 
    print g, list([i[0] for i in inds]) 

, который производит

1 [0, 1] 
2 [2, 3, 4] 
3 [5] 
4 [6] 
5 [7] 
6 [8, 9] 
7 [10] 
8 [11, 12, 13] 

Вы можете сказать, что первый элемент группы, а второй список индексов. У Numpy есть обширные утилиты для нарезания индекса &, указанного в таких списках.

+0

Извините, но я не вижу 'S' в вашем коде? Группы находятся в 'A', но данные, которые я хочу сгруппировать, находятся в' S'. – sweeeeeet

+0

Ум, да, это «скрывается» в '' ... ''. Вот где я предлагаю вам ввести код, доступ к '' S''. –

+0

Извините, но я не могу это выяснить сам. Я читал 10 раз в группе. – sweeeeeet

Смежные вопросы