Scipy sparse.kron дает не разреженную матрицу - PullRequest
0 голосов
/ 30 марта 2019

Я получаю неожиданные не разреженные результаты при использовании метода kron разреженного модуля Сципи. В частности, матричные элементы, которые равны нулю после выполнения произведения Кронекера, сохраняются в результате, и я хотел бы понять, что я должен сделать, чтобы вывод по-прежнему был полностью разреженным.

Вот пример того, что я имею в виду, взяв продукт kronecker из двух копий удостоверения личности:

import scipy.sparse as sp

s = sp.eye(2)

S = sp.kron(s,s)

S 
<4x4 sparse matrix of type '<class 'numpy.float64'>'
with 8 stored elements (blocksize = 2x2) in Block Sparse Row format>

print(S)

(0, 0)  1.0
(0, 1)  0.0
(1, 0)  0.0
(1, 1)  1.0
(2, 2)  1.0
(2, 3)  0.0
(3, 2)  0.0
(3, 3)  1.0

Разреженная матрица S должна содержать только 4 (диагональных) ненулевых элемента, но здесь также есть другие элементы, равные нулю. Любые указатели на то, что я делаю неправильно, будут высоко оценены.

1 Ответ

1 голос
/ 30 марта 2019

В

Преобразование из разреженного в плотное в разреженное снова уменьшает плотность после построения разреженной матрицы

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

Если вы укажете другой формат, kron не будет выдавать эти нули:

In [672]: sparse.kron(s,s,format='csr')                                         
Out[672]: 
<4x4 sparse matrix of type '<class 'numpy.float64'>'
    with 4 stored elements in Compressed Sparse Row format>
In [673]: _.A                                                                   
Out[673]: 
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
...