首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在做两个稀疏矩阵的张量乘积后消除零点?

如何在做两个稀疏矩阵的张量乘积后消除零点?
EN

Stack Overflow用户
提问于 2019-01-30 02:15:47
回答 1查看 235关注 0票数 0

我想做两个稀疏矩阵的张量乘积。我使用以下代码

代码语言:javascript
复制
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)项分配存储器,即使这些条目也都是零。这绝对是对记忆的浪费,特别是在我做了多次张量积之后。在计算之后,是否有办法避免这些条目的出现或删除这些条目?非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-30 02:53:09

代码语言:javascript
复制
In [142]: sig1 = sparse.csc_matrix(np.array([[0, 1],[1, 0]]))
     ...: sig2 = sparse.csc_matrix(np.array([[0 , -1],[1 , 0]]))

我们看到0,因为返回格式是块稀疏行:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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版本的属性是:

代码语言:javascript
复制
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等效的属性:

代码语言:javascript
复制
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较小,但indicesindptr更大。如果矩阵要大得多,差异可能会更明显。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54432457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档