Как устранить нули после выполнения тензорного произведения двух разреженных матриц в scipy? - PullRequest
0 голосов
/ 30 января 2019

Я хочу сделать тензорное произведение двух разреженных матриц в scipy.И я использую следующий код

sig1 = csc_matrix(np.array([[0, 1],[1, 0]]))
sig2 = csc_matrix(np.array([[0 , -1],[1 , 0]]))
print(sparse.kron(sig1, sig2))

Однако я получаю следующий результат

(2, 0) 0 (3, 0) 1 (2, 1) -1 (3, 1) 0 (0, 2) 0 (1, 2) 1 (0, 3) -1 (1, 3) 0
, что означает, что разреженная матрица выделяет память также для (2,0) (3,1) (0,2) (1,3) записей, даже если эти записи также являются нулями.Это определенно пустая трата памяти, особенно после того, как я несколько раз делаю тензорный продукт.Есть ли способ избежать этого в scipy или устранить эти записи после вычисления?Большое спасибо!

1 Ответ

0 голосов
/ 30 января 2019
In [142]: sig1 = sparse.csc_matrix(np.array([[0, 1],[1, 0]]))
     ...: sig2 = sparse.csc_matrix(np.array([[0 , -1],[1 , 0]]))

Мы видим 0, потому что возвращаемым форматом является Block Sparse Row:

In [143]: M=sparse.kron(sig1,sig2)
In [144]: M
Out[144]: 
<4x4 sparse matrix of type '<class 'numpy.int64'>'
    with 8 stored elements (blocksize = 2x2) in Block Sparse Row format>
In [145]: M.A
Out[145]: 
array([[ 0,  0,  0, -1],
       [ 0,  0,  1,  0],
       [ 0, -1,  0,  0],
       [ 1,  0,  0,  0]], dtype=int64)

Если мы укажем другой формат, мы не увидим 0s:

In [146]: M=sparse.kron(sig1,sig2, format='csc')
In [147]: M
Out[147]: 
<4x4 sparse matrix of type '<class 'numpy.int64'>'
    with 4 stored elements in Compressed Sparse Column format>
In [148]: M.A
Out[148]: 
array([[ 0,  0,  0, -1],
       [ 0,  0,  1,  0],
       [ 0, -1,  0,  0],
       [ 1,  0,  0,  0]], dtype=int64)

Код kron говорит, что он использует BSR, потому что sig2 является относительно плотным.Атрибуты версии BSR:

In [150]: M=sparse.kron(sig1,sig2)
In [151]: M.indptr
Out[151]: array([0, 1, 2], dtype=int32)
In [152]: M.indices
Out[152]: array([1, 0], dtype=int32)
In [153]: M.data
Out[153]: 
array([[[ 0, -1],
        [ 1,  0]],

       [[ 0, -1],
        [ 1,  0]]], dtype=int64)

Атрибуты для csr эквивалента:

In [158]: M1=sparse.kron(sig1,sig2, 'csr')
In [159]: M1.indptr
Out[159]: array([0, 1, 2, 3, 4], dtype=int32)
In [160]: M1.indices
Out[160]: array([3, 2, 1, 0], dtype=int32)
In [161]: M1.data
Out[161]: array([-1,  1, -1,  1], dtype=int64)

data меньше, но indices и indptr больше.Различия могут быть более заметными, если матрицы намного больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...