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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
