加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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)]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读