python - 在scipy中对两个稀疏矩阵进行张量积后如何消除零点?
问题描述
我想在 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 中避免它或在计算后消除这些条目?非常感谢!
解决方案
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)
如果我们指定另一种格式,我们看不到 0:
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
更大。如果矩阵更大,差异可能会更明显。
推荐阅读
- javascript - 从 li 中删除子弹
- swift - SwiftUI 组合搜索文本
- python-3.x - 在 Python 中出现意外的 NoneType 错误
- scala - Scala splat 运算符仅用于参数列表的一部分
- python - 按索引过滤熊猫 - Keyerror
- charts - 谷歌图表在 Y 轴上更改总数
- mysql - 如何将 MongoDB 指南针社区数据库应用于我的应用程序?
- javascript - 如何获取css样式规则或html标签样式中设置的样式宽度值
- python - Python 项目帮助(类/预期类型)
- javascript - 我应该使用我拥有的代码收到此 TypeError 消息吗?