2016-10-08 2 views
0

Один из лучших способов построить скудную разреженную матрицу - это метод coo_matrix ie.Постройте большую скудную разреженную матрицу

coo_matrix((data, (i, j)), [shape=(M, N)]) 

where: 
data[:] are the entries of the matrix, in any order 
i[:] are the row indices of the matrix entries 
j[:] are the column indices of the matrix entries 

Но, если матрица очень велика это не практично, чтобы загрузить весь I, J и данных векторов в память.

Как вы создаете coo_matrix, так что (data, (i, j)) подается (с итератором или генератором) с диска, а объекты массива/вектора на диске либо находятся в форматах .npy или pickle?

Pickle - лучший вариант, поскольку numpy.save/load не оптимизирован для scipy разреженных. Возможно, есть еще более быстрый формат.

Оба типа numpy.genfromtext() и numpy.loadtxt() являются громоздкими, медленными и запоминающимися.

ответ

0

Я не совсем понимаю. Если массивы i, j, data слишком велики для создания или загрузки в память, они слишком велики для создания разреженной матрицы.

Если эти три массива действительны, результирующая разреженная матрица будет использовать их без копирования или изменения в качестве соответствующих атрибутов. Матрица csr, построенная из coo, может быть немного более компактной, поскольку ее массив indptr имеет одно значение для каждой строки. Массивы data и indices будут иметь тот же размер, что и coo (дайте или возьмите данные дубликатов и сортировки).

dok и lil форматы могут использоваться для создания инкрементной матрицы, но они не будут сохранять память в конечном итоге. Оба должны иметь запись для каждой ненулевой точки данных. В случае с lil у вас будет куча списков; а dok - настоящий словарь.

Ни один из разреженных форматов не является «виртуальным», создавая элементы «на лету» по мере необходимости.

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

In [782]: data=np.ones((10,),int) 
In [783]: rows=np.arange(10) 
In [784]: cols=np.arange(10) 
In [785]: M=sparse.coo_matrix((data,(rows,cols))) 
In [786]: M.data 
Out[786]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 
In [787]: M.data is data 
Out[787]: True 
In [789]: M.col is cols 
Out[789]: True 

В основном формат coo является способ хранения этих 3 массивов. Реальная работа, вся математика, суммирование, даже индексирование, выполняется с помощью формата csr.

+0

Используя ваш пример для создания coo_matrix, память содержит данные объектов, строки, столбцы и M. Вопрос в том, может ли coo_matrix создавать инкрементно с потоковыми строками, столбцами и данными. Ваш ответ подсказывает, что это невозможно. –

+0

Код '__init__' для' coo_matrix' написан на Python и прост в использовании. Код для 'bmat', который строит матрицу' coo' из блоков, также будет поучительным. – hpaulj

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