Для циклов к матрице смежности в Python - PullRequest
0 голосов
/ 20 октября 2018

Мне нужно сделать для циклов к матрице смежности в Python.Моя цель - найти первый и второй порядок соседей по матрице.Я сделал матрицу с соприкосновением королевы писала.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.

Как мне сделать циклы для построения словаря списков?Например: {'A': ['C', 'H', 'K', 'G', 'B']}

1 Ответ

0 голосов
/ 20 октября 2018

Похоже, у вас на самом деле есть две задачи:

  1. преобразование кадра данных pandas в словарь, показывающий соседей первого порядка
  2. преобразование этого словаря в словарь, показывающий соседей второго порядка

Для первого задания вы можете использовать функцию 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

Now 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']}

EXTRA

Если вас интересуют не только соседи второго порядка (третий, четвертый и т. Д.), Вы можете повторно вызывать функцию 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
...