我有以下numpy数组:
import numpy as np
pair_array = np.array([(205, 254), (205, 382), (254, 382), (18, 69), (205, 382),
(31, 183), (31, 267), (31, 382), (183, 267), (183, 382)])
print(pair_array)
#[[205 254]
# [205 382]
# [254 382]
# [ 18 69]
# [205 382]
# [ 31 183]
# [ 31 267]
# [ 31 382]
# [183 267]
# [183 382]]
有没有一种方法可以将此数组转换为包含所有可能组合的出现次数的对称 Pandas 数据框?我期望与此类似:
# 18 31 69 183 205 254 267 382
# 18 0 0 1 0 0 0 0 0
# 31 0 0 0 1 0 0 1 1
# 69 1 0 0 0 0 0 0 0
# 183 0 1 0 0 0 0 1 1
# 205 0 0 0 0 0 1 0 2
# 254 0 0 0 0 1 0 0 1
# 267 0 1 0 1 0 0 0 0
# 382 0 1 0 1 2 1 0 0
最佳答案
一种方法可能是使用NetworkX构建图并使用 nx.to_pandas_adjacency
直接获得邻接矩阵作为数据帧。为了说明图中各边的同时出现,我们可以创建一个 nx.MultiGraph
,它允许连接同一对节点的多个边:
import networkx as nx
G = nx.from_edgelist(pair_array, create_using=nx.MultiGraph)
nx.to_pandas_adjacency(G, nodelist=sorted(G.nodes()), dtype='int')
18 31 69 183 205 254 267 382
18 0 0 1 0 0 0 0 0
31 0 0 0 1 0 0 1 1
69 1 0 0 0 0 0 0 0
183 0 1 0 0 0 0 1 1
205 0 0 0 0 0 1 0 2
254 0 0 0 0 1 0 0 1
267 0 1 0 1 0 0 0 0
382 0 1 0 1 2 1 0 0
建立NetworkX
图,还可以根据我们期望的行为创建邻接矩阵或其他矩阵。我们可以使用以下方法创建它:nx.Graph
:如果我们想要将1
(或(x,y)
)边缘的条目y,x
和((x,y)
)都设置为(y,x)
。因此,这将产生对称的邻接矩阵nx.DiGraph
:如果(x,y)
仅应将(x,y)
设置为1
,则为nx.MultiGraph
:与nx.Graph
相同的行为,但考虑到边缘共现nx.MultiDiGraph
:与nx.DiGraph
相同的行为,但也考虑了边缘共现关于python - 如何将两列数组转换为具有出现次数的矩阵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64464861/