Хотя вы могли бы воспроизвести 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 массив.
Итак, я выполнил ваш пример, и последний массив получен из M.data, правильно? Это было бы эквивалентно одномерному np.array. – aaragon
'M.data' - это 1-й массив, но он имеет ненулевые значения (или то, что вы дали ему через' coo_matrix'). Вам нужно включить 'M.col', чтобы узнать, где нули (или нет). – hpaulj