[英]For loops to a adjacency matrix in python
我需要在python中对邻接矩阵进行for循环。 我的目标是在矩阵中找到邻居的一阶和二阶。 我用 pysal 皇后邻接做了矩阵。 1 是邻居,0 不是邻居。代码:
import pandas as pd
import pysal as ps
w = ps.queen_from_shapefile('test.shp')
Wmatrix, ids = w.full()
Wmatrix
W_DataFrame = pd.DataFrame(Wmatrix,columns=["A","B","C","D","E","F",
"G","H","I","J","K","L",
"N","M"],
index=["A","B","C","D","E","F",
"G","H","I","J","K","L",
"N","M"])
print W_DataFrame
矩阵是:
A B C D E F G H I J K L N M
A 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0
B 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0
C 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0
D 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0
E 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0
F 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0
G 1.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0
H 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0
I 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 0.0 0.0
J 0.0 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0
K 1.0 0.0 1.0 0.0 1.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0
L 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0
N 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
M 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0
例如:位置 A 有 3 个第一个邻居 (C,H,K),B 是 G 的邻居,C 是 B 的邻居。
如何使用 for 循环来构建列表字典? 如:{'A': ['C','H','K','G','B']}
看起来您实际上在这里有两个任务:
对于第一个任务,您可以使用to_dict
pandas 函数将数据to_dict
转换为字典字典,然后根据子字典的值是 0.0 还是 1.0 来过滤子字典。 以您的数据框df
为例:
d = {}
for k, subdict in df.to_dict().items():
neighbours = []
for k2, value in subdict.items():
if value:
neighbours.append(k2)
d[k] = neighbours
现在d
是一个字典,其中包含每个键的一阶邻居:
print(d)
{'A': ['C', 'G', 'K'],
'B': ['E', 'G', 'I'],
'C': ['A', 'D', 'H', 'J', 'K', 'L', 'M'],
'D': ['C', 'J', 'N'],
'E': ['B', 'G', 'I', 'K'],
'F': ['J', 'N'],
'G': ['A', 'B', 'E', 'K'],
'H': ['C', 'I', 'K', 'L'],
'I': ['B', 'E', 'H', 'K', 'L'],
'J': ['C', 'D', 'F', 'N', 'M'],
'K': ['A', 'C', 'E', 'G', 'H', 'I'],
'L': ['C', 'H', 'I', 'M'],
'N': ['D', 'F', 'J'],
'M': ['C', 'J', 'L']}
为了将其转换为显示二阶邻居,您应该遍历每个键的值,查找每个值的邻居并将它们添加到原始值列表中。
def find_second_order_neighbours(d):
d2 = {}
for k, neighbours in d.items(): # loop over the dictionary
new_neighbours = set(neighbours) # create a temporary set to store all second order neighbours
for neighbour in neighbours: # loop over the original neighbours
new_neighbours = (new_neighbours | set(d[neighbour])) - {k} # add all second order neighbours ignoring duplicates (and making sure k is not its own neighbour)
d2[k] = list(new_neighbours) # update the dictionary to return
return d2
print(find_second_order_neighbours(d))
{'A': ['E', 'K', 'G', 'C', 'L', 'J', 'I', 'H', 'M', 'D', 'B'],
'B': ['E', 'G', 'K', 'L', 'A', 'I', 'H'],
'C': ['N', 'E', 'K', 'G', 'L', 'A', 'J', 'I', 'H', 'M', 'F', 'D'],
'D': ['N', 'K', 'C', 'L', 'A', 'J', 'H', 'M', 'F'],
'E': ['K', 'G', 'C', 'L', 'A', 'I', 'H', 'B'],
'F': ['N', 'C', 'J', 'M', 'D'],
'G': ['E', 'K', 'C', 'A', 'I', 'H', 'B'],
'H': ['E', 'K', 'G', 'C', 'L', 'A', 'J', 'I', 'M', 'D', 'B'],
'I': ['E', 'K', 'G', 'C', 'L', 'A', 'H', 'M', 'B'],
'J': ['N', 'K', 'C', 'L', 'A', 'H', 'M', 'F', 'D'],
'K': ['E', 'G', 'C', 'L', 'A', 'J', 'I', 'H', 'M', 'D', 'B'],
'L': ['E', 'K', 'C', 'A', 'J', 'I', 'H', 'M', 'D', 'B'],
'N': ['C', 'J', 'M', 'F', 'D'],
'M': ['N', 'K', 'C', 'L', 'A', 'J', 'I', 'H', 'D', 'F']}
额外的
如果您对二阶邻居(三阶、四阶等)感兴趣,您可以重复调用find_second_order_neighbours
函数来查找n
阶邻居,如下所示:
def find_n_order_neighbours(n, d):
while n > 1:
d = find_second_order_neighbours(d)
n -= 1
return d
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.