Поиск соседей в пандах на основе общих узлов - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть фрейм данных с элементами FEM и их узлами.
Мне нужно найти соседние элементы из этих данных вместе с их соответствующим местоположением.
Пример данных выглядит так:

| El_ID | Node_SW | Node_NW | Node_NE | Node_SE |
|-------|---------|---------|---------|---------|
| 755   | 1412    | 1413    | 1459    | 1458    |
| 756   | 1413    | 1414    | 1460    | 1459    |
| 802   | 1458    | 1459    | 1505    | 1504    |

Сравнение (Node_SW, Node_SE) с (Node_NW, Node_NE) дает соседний элемент 756 как Сосед_Северный до 755 и наоборот. Сравнение (Node_NE, Node_SE) с (Node_NW, Node_SW) дает западных и восточных соседей соответственно.

Вывод должен выглядеть примерно так

| El_ID | Node_SW | Node_NW | Node_NE | Node_SE | El_S | El_N |El_W|El_E|...
|-------|---------|---------|---------|---------|------|------|----|----|...
| 755   | 1412    | 1413    | 1459    | 1458    |  754 |  756 | 802| 708|...
| 756   | 1413    | 1414    | 1460    | 1459    |  755 |  NaN | 803| 709|...
| 802   | 1458    | 1459    | 1505    | 1504    |  801 |  803 | 849| 755|...
...

Идентификаторы Element_ID могут быть отсортированы, но обычно они случайные. Мне удалось получить окрестность элемента на расстоянии ширины элемента с помощью KDTree от scipy, но я не получаю никакой информации о местоположении (S, N, E, W).

У кого-нибудь есть идеи, как это можно сделать с пандами или с обломками? Я хотел бы уклониться от циклов, потому что таблицы элементов могут быть очень длинными ....

Спасибо

1 Ответ

0 голосов
/ 06 сентября 2018

С пандами вы можете делать следующее:

data = [[755   , 1412    , 1413    , 1459    , 1458],    
         [756   , 1413    , 1414    , 1460    , 1459] ,  
         [802  , 1458    , 1459    , 1505    , 1504]] 

df = pd.DataFrame(data, columns=['El_ID',  'Node_SW' , 'Node_NW' , 'Node_NE' , 'Node_SE'])

затем, чтобы получить соседа по соотношению Node_SW - Node_NW,

pd.merge(df, df, left_on= 'Node_SW', right_on='Node_NW')

вывод

    El_ID_x     Node_SW_x   Node_NW_x   Node_NE_x   Node_SE_x   El_ID_y     Node_SW_y   Node_NW_y   Node_NE_y   Node_SE_y
0   756     1413    1414    1460    1459    755     1412    1413    1459    1458

Вы получаете соотношение между 756 и 755.

Вы должны сделать то же самое для других секторов.

...