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)) 

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

  • В чем разница между numpy.linalg.lstsq и scipy.linalg.lstsq?
  • Scipy редкие ... массивы?
  • Как работает функция scipy distance_transform_edt?
  • Установка NumPy и SciPy на 64-битной Windows (с помощью Pip)
  • Эффективное вычисление дисперсии изображения python
  • Исключительная интерполяция с замаскированными данными?
  • Networkx: Различия между pagerank, pagerank_numpy и pagerank_scipy?
  • Целочисленный размер шага в scipy оптимизирует минимизацию
  • Python - лучший язык программирования в мире.