2015-04-10 4 views
1

Я пытаюсь создать разреженный вектор из серии массивов, где есть некоторые перекрывающиеся индексы. Для матрицы есть очень convenient object in scipy, что делает именно это:есть что-то вроде coo_matrix, но для разреженных векторов?

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

Так что, если данные, случается, есть повторяющиеся элементы (из-за их I, J индексы одинаковы), те, которые суммируются в конечной разреженной матрице. Мне было интересно, можно ли сделать что-то подобное, но для разреженных векторов, или я просто должен использовать этот объект и притворяться, что это матрица с 1 столбцом?

ответ

1

Хотя вы могли бы воспроизвести 1-й эквивалент, это сэкономит много работы, чтобы просто работать с 1-строчной (или 1 колотой) разреженной матрицей. Я не знаю ни одного разреженного векторного пакета для numpy.

Формат coo хранит входные массивы точно так же, как вы их давали, без суммирования. Суммирование производится, когда оно отображается или (иначе) преобразуется в формат или csr. А так как конструктор csr скомпилирован, он будет с этим суммированием быстрее, чем все, что вы могли бы закодировать в Python.

Построить '1D' разреженных COO матрицу

In [67]: data=[10,11,12,14,15,16]  
In [68]: col=[1,2,1,5,7,5] 
In [70]: M=sparse.coo_matrix((data (np.zeros(len(col)),col)),shape=(1,10)) 

Посмотрите на его представления данных (не суммирование)

In [71]: M.data 
Out[71]: array([10, 11, 12, 14, 15, 16]) 
In [72]: M.row 
Out[72]: array([0, 0, 0, 0, 0, 0]) 
In [73]: M.col 
Out[73]: array([1, 2, 1, 5, 7, 5]) 

взгляд на представлении массива (не форма (1,10))

In [74]: M.A 
Out[74]: array([[ 0, 22, 11, 0, 0, 30, 0, 15, 0, 0]]) 

и эквивалент csr.

In [75]: M1=M.tocsr() 
In [76]: M1.data 
Out[76]: array([22, 11, 30, 15]) 
In [77]: M1.indices 
Out[77]: array([1, 2, 5, 7]) 
In [78]: M1.indptr 
Out[78]: array([0, 4]) 

In [79]: np.nonzero(M.A) 
Out[79]: (array([0, 0, 0, 0]), array([1, 2, 5, 7])) 

nonzero показывает ту же картину:

In [80]: M.nonzero() 
Out[80]: (array([0, 0, 0, 0, 0, 0]), array([1, 2, 1, 5, 7, 5])) 

In [81]: M.tocsr().nonzero() 
Out[81]: (array([0, 0, 0, 0]), array([1, 2, 5, 7])) 

In [82]: np.nonzero(M.A) 
Out[82]: (array([0, 0, 0, 0]), array([1, 2, 5, 7])) 

M.toarray().flatten() даст вам (10,) 1d массив.

+0

Итак, я выполнил ваш пример, и последний массив получен из M.data, правильно? Это было бы эквивалентно одномерному np.array. – aaragon

+0

'M.data' - это 1-й массив, но он имеет ненулевые значения (или то, что вы дали ему через' coo_matrix'). Вам нужно включить 'M.col', чтобы узнать, где нули (или нет). – hpaulj

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