scipy csr_matrix из нескольких векторов, представленных в виде списка множеств

У меня есть несколько разреженных векторов, представленных в виде списков кортежей, например.

[[(22357, 0.6265631775164965), (31265, 0.3900572375543419), (44744, 0.4075397480094991), (47751, 0.5377595092643747)], [(22354, 0.6265631775164965), (31261, 0.3900572375543419), (42344, 0.4075397480094991), (47751, 0.5377595092643747)], ... ] 

И моя цель – scipy.sparse.csr_matrix из нескольких миллионов векторов, подобных этому.

Я хотел бы спросить, существует ли какое-то простое элегантное решение для такого преобразования, не пытаясь застрять все на памяти.

EDIT: Просто пояснение: Моя цель состоит в том, чтобы построить матрицу 2d, где каждый из моих разреженных векторов представляет одну строку в матрице.

2 Solutions collect form web for “scipy csr_matrix из нескольких векторов, представленных в виде списка множеств”

Сбор indices,data в структурированный массив исключают проблему с двойным преобразованием целых чисел. Это также немного быстрее, чем подход vstack (при ограниченном тестировании) (со списком данных, таких как np.array , быстрее, чем np.vstack .)

 indptr = np.cumsum([0]+[len(i) for i in vectors]) aa = np.array(vectors,dtype='i,f').flatten() A = sparse.csr_matrix((aa['f1'], aa['f0'], indptr)) 

Я заменил понимание списка для map так как я использую Python3.

Индикаторы в формате coo (data, (i,j)) могут быть более интуитивными

 ii = [[i]*len(v) for i,v in enumerate(vectors)]) ii = np.array(ii).flatten() aa = np.array(vectors,dtype='i,f').flatten() A2 = sparse.coo_matrix((aa['f1'],(np.array(ii), aa['f0']))) # A2.tocsr() 

Здесь ii с первого шага – номера строк для каждого подсписок.

 [[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], ...]] 

Этот метод построения медленнее, чем прямой indptr .


Для случая, когда имеется различное количество записей в строке, этот подход работает (используя intertools.chain для сглаживания списков):

Пример списка (теперь нет пустых строк):

 In [779]: vectors=[[(1, .12),(3, .234),(6,1.23)], [(2,.222)], [(2,.23),(1,.34)]] 

индексы строк:

 In [780]: ii=[[i]*len(v) for i,v in enumerate(vectors)] In [781]: ii=list(chain(*ii)) 

столбцы и данные, вытащенные из кортежей и сплющенные

 In [782]: jj=[j for j,_ in chain(*vectors)] In [783]: data=[d for _,d in chain(*vectors)] In [784]: ii Out[784]: [0, 0, 0, 1, 2, 2] In [785]: jj Out[785]: [1, 3, 6, 2, 2, 1] In [786]: data Out[786]: [0.12, 0.234, 1.23, 0.222, 0.23, 0.34] In [787]: A=sparse.csr_matrix((data,(ii,jj))) # coo style input In [788]: AA Out[788]: array([[ 0. , 0.12 , 0. , 0.234, 0. , 0. , 1.23 ], [ 0. , 0. , 0.222, 0. , 0. , 0. , 0. ], [ 0. , 0.34 , 0.23 , 0. , 0. , 0. , 0. ]]) 

Рассмотрим следующее:

 import numpy as np from scipy.sparse import csr_matrix vectors = [[(22357, 0.6265631775164965), (31265, 0.3900572375543419), (44744, 0.4075397480094991), (47751, 0.5377595092643747)], [(22354, 0.6265631775164965), (31261, 0.3900572375543419), (42344, 0.4075397480094991), (47751, 0.5377595092643747)]] indptr = np.cumsum([0] + map(len, vectors)) indices, data = np.vstack(vectors).T A = csr_matrix((data, indices.astype(int), indptr)) 

К сожалению, таким образом индексы столбцов преобразуются из целых чисел в двойные и обратно. Это работает правильно для очень больших матриц, но не является идеальным.

  • Рекомендация импорта SciPy / NumPy
  • Python curve_fit с несколькими независимыми переменными
  • scipy.spatial ValueError: "x должен состоять из векторов длины% d, но имеет форму% s"
  • Как рассчитать вероятность скручивания кривой в scipy?
  • цветная карта matplotlib с использованием бикубической интерполяции
  • Деление Numles Cholesky LinAlgError
  • Пример, чтобы понять функцию оптимизации прыжкового прыжка
  • hdf5 не поддерживается (пожалуйста, установите / переустановите h5py) Scipy не поддерживается! при импорте TFLearn?
  • симулятор реалистичного сигнала ЭКГ из данных rr для matlab или python
  • Эффективное распределение многопоточных и плотных матриц Numpy / Scipy
  • Вычислить кумулятивную функцию распределения (CDF) в Python
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.