我有一个很大的稀疏数组(Python csr),如何找到不全为零的列的索引?例如,如果矩阵看起来像下面构造的s
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]。
v9tzhpje1#
from scipy.sparse import csr_matrix A = csr_matrix([[1,2,0],[0,0,3],[4,0,5]]) nonzero_indices = A.nonzero()
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
7y4bm7vi2#
我认为您可以用途:
import numpy as np np.nonzero((s!=0).sum(0))[1]
输出:[0, 3]
[0, 3]
s4chpxco3#
虽然sum(0)解决方案是正确的,但在我看来它做了一点额外的工作。您所需要的很容易在csc格式中完成。
sum(0)
import numpy as np t = s.tocsc() np.nonzero(t.indptr[:-1] != p.indptr[1:])[0]
如果你需要处理一个大的矩阵,这可能会更好,虽然我没有测试它。
t.indptr以CSC格式存储每列(CSR中的行)的t.indices和t.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在这里是成本最高的操作,并且它在非零元素的数量上是线性的。
t.indptr
t.indices
t.data
i
t.indices[t.indptr[i]:t.indptr[i+1]
t.indptr[i]
t.indptr[i+1]
t.indptr = [0, 1, 1, 1, 2]
t.indptr[i] == t.indptr[i+1]
3条答案
按热度按时间v9tzhpje1#
nonzero()
将返回一个包含两个列表的元组,其中包含您要查找的索引。例如:将给予
7y4bm7vi2#
我认为您可以用途:
输出:
[0, 3]
s4chpxco3#
虽然
sum(0)
解决方案是正确的,但在我看来它做了一点额外的工作。您所需要的很容易在csc格式中完成。如果你需要处理一个大的矩阵,这可能会更好,虽然我没有测试它。
说明
t.indptr
以CSC格式存储每列(CSR中的行)的t.indices
和t.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在这里是成本最高的操作,并且它在非零元素的数量上是线性的。