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
больше.Различия могут быть более заметными, если матрицы намного больше.