python – Numpy-从2D数组获取邻居矩阵
发布时间:2020-12-20 11:47:03 所属栏目:Python 来源:网络整理
导读:我有一个无向图,由下式给出: A,BA,CA,FB,DC,FE,DE,F 我需要将其转换为矩阵N,其中 N[x,y] = 1 if x is neighbor of y (like A and B) and 0 if not 最快的方法是什么? NOTA图表存储为numpy字符串数组: array([['A','B'],['A','C'],'F'],['B','D'],['C',['E
我有一个无向图,由下式给出:
A,B A,C A,F B,D C,F E,D E,F 我需要将其转换为矩阵N,其中 N[x,y] = 1 if x is neighbor of y (like A and B) and 0 if not 最快的方法是什么? NOTA图表存储为numpy字符串数组: array([['A','B'],['A','C'],'F'],['B','D'],['C',['E','F']],dtype='|S4') 预期产量: A B C D E F A 1 1 1 0 0 1 B 1 1 0 1 0 0 C 1 0 1 1 0 1 D 0 1 1 1 1 0 E 0 0 0 1 1 1 F 1 0 1 0 1 1 谢谢 解决方法
这是一种NumPythonic方法 –
# Tag each string with a numeric ID based on the uniqueness among other strings _,ID = np.unique(graph,return_inverse=True) M = ID.reshape(graph.shape) # Consider each row of numeric IDs as an indexing tuple of a 2D array. # Calculate the linear indices corresponding to each tuple. n = M.max()+1 idx1 = M[:,0]*(n) + M[:,1] idx2 = M[:,1]*(n) + M[:,0] # Setup output array with 1s on the diagonal. out = np.eye(n,dtype=int) # Put 1s at places specified by the earlier computed pairs of linear indices np.put(out,[idx1,idx2],1) 样本输入,输出 – In [93]: graph Out[93]: array([['A',dtype='|S4') In [94]: out Out[94]: array([[1,1,1],[1,0],[0,1]]) 运行时测试 本节基本上比较了迄今为止列出的所有方法(在这篇文章和其他帖子中)解决案例的表现. 定义功能 – def networkx_based(a): #@atomh33ls's solution code A=nx.Graph() for x in a: A.add_edge(x[0],x[1]) return nx.adjacency_matrix(A) def vectorize_based(data): # @plonser's solution code ord_u = np.vectorize(lambda x: ord(x)-65) s = ord_u(data) res = np.zeros((s.max()+1,s.max()+1),dtype=int) res[s[:,s[:,1]] = 1 res_sym = res + res.T np.fill_diagonal(res_sym,1) return res_sym def unique_based(graph): #solution from this post _,return_inverse=True) M = ID.reshape(graph.shape) n = M.max()+1 idx1 = M[:,1] idx2 = M[:,0] out = np.eye(n,dtype=int) np.put(out,1) return out 计时 – In [321]: N = 1000 In [322]: arr = np.random.randint(65,90,(N,2)) In [323]: graph = np.array([map(chr,a) for a in arr],dtype='S4') In [324]: %timeit networkx_based(graph) 100 loops,best of 3: 3.79 ms per loop In [325]: %timeit vectorize_based(graph) 1000 loops,best of 3: 760 μs per loop In [326]: %timeit unique_based(graph) 1000 loops,best of 3: 405 μs per loop (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |