scipy 如何查找稀疏矩阵中不全为零的列的索引

ercv8c1e  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(128)

我有一个很大的稀疏数组(Python csr),如何找到不全为零的列的索引?
例如,如果矩阵看起来像下面构造的s

In [13]: import  scipy.sparse as sparse

In [14]: s=sparse.dok_matrix((2,4))

In [15]: s[0,0]=8; s[0,3]=9

In [16]:  print (s.toarray())
[[8. 0. 0. 9.]
 [0. 0. 0. 0.]]

矩阵s的非零索引将是[0,3]。

v9tzhpje

v9tzhpje1#

from scipy.sparse import csr_matrix                                                                     

A = csr_matrix([[1,2,0],[0,0,3],[4,0,5]])                                                               

nonzero_indices = A.nonzero()

nonzero()将返回一个包含两个列表的元组,其中包含您要查找的索引。例如:

for i,_ in enumerate(nonzero_indices[0]):                                                               
    print(nonzero_indices[0][i], nonzero_indices[1][i])

将给予

0 0
0 1
1 2
2 0
2 2
7y4bm7vi

7y4bm7vi2#

我认为您可以用途:

import numpy as np
np.nonzero((s!=0).sum(0))[1]

输出:[0, 3]

s4chpxco

s4chpxco3#

虽然sum(0)解决方案是正确的,但在我看来它做了一点额外的工作。您所需要的很容易在csc格式中完成。

import numpy as np
t = s.tocsc()
np.nonzero(t.indptr[:-1] != p.indptr[1:])[0]

如果你需要处理一个大的矩阵,这可能会更好,虽然我没有测试它。

说明

t.indptr以CSC格式存储每列(CSR中的行)的t.indicest.data的索引。行i的索引存储在t.indices[t.indptr[i]:t.indptr[i+1]中:t.indptr[i]是起始位置,t.indptr[i+1]是结束位置。对于您的示例,CSC格式为t.indptr = [0, 1, 1, 1, 2]。如果t.indptr[i] == t.indptr[i+1],则没有与列(行)i对应的元素。
转换为CSC在这里是成本最高的操作,并且它在非零元素的数量上是线性的。

相关问题