python – 从逻辑矩阵到集合列表的最快方式
发布时间:2020-12-20 11:52:18 所属栏目:Python 来源:网络整理
导读:我需要将稀疏逻辑矩阵转换为集合列表,其中每个列表[i]包含具有列[i]的非零值的行集.以下代码有效,但我想知道是否有更快的方法来执行此操作.我使用的实际数据大约是6000×6000,比这个例子要稀疏得多. import numpy as npA = np.array([[1,1],[0,1,0],[1,0]])r
我需要将稀疏逻辑矩阵转换为集合列表,其中每个列表[i]包含具有列[i]的非零值的行集.以下代码有效,但我想知道是否有更快的方法来执行此操作.我使用的实际数据大约是6000×6000,比这个例子要稀疏得多.
import numpy as np A = np.array([[1,1],[0,1,0],[1,0]]) rows,cols = A.shape C = np.nonzero(A) D = [set() for j in range(cols)] for i in range(len(C[0])): D[C[1][i]].add(C[0][i]) print D 解决方法
如果将稀疏数组表示为
csc_matrix ,则可以使用indices和indptr属性来创建集合.
例如, In [93]: A Out[93]: array([[1,0]]) In [94]: from scipy.sparse import csc_matrix In [95]: C = csc_matrix(A) In [96]: C.indptr Out[96]: array([ 0,5,8,12,16,20,23],dtype=int32) In [97]: C.indices Out[97]: array([0,2,3,4,6,7,3],dtype=int32) In [98]: D = [set(C.indices[C.indptr[i]:C.indptr[i+1]]) for i in range(C.shape[1])] In [99]: D Out[99]: [{0,5},{1,4},7},6},{0,3}] 对于数组而不是集合的列表,只需不要调用set(): In [100]: [C.indices[C.indptr[i]:C.indptr[i+1]] for i in range(len(C.indptr)-1)] Out[100]: [array([0,5],dtype=int32),array([1,4],7],6],array([0,dtype=int32)] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |