2017-10-16 318 views
0

我使用Python Networkx建立的曲線圖和我有以下的節點位置作爲一個例子(positions.txt):Python Scipy和Networkx:如何計算歐幾里德距離矩陣?

1 21.5 23 
2 24.5 20 
3 19.5 19 
4 22.5 15 
5 24.5 12 

節點ID,X,Y予讀取使用熊貓文件並將位置設置爲Networkx中的節點屬性。在for循環中使用add_edge(id1, id2, weight)方法添加節點(沒有自身邊緣)。到目前爲止,我已經假設所有的節點默認都是相互連接的,並且沒有考慮節點的半徑或距離等參數。
現在,我想計算使用這些節點位置的節點之間的歐幾里德半徑或距離矩陣,並且使用此矩陣,我希望能夠打印落在給定半徑範圍內的節點的鄰居,並將該文件另存爲一個csv矩陣文件。一位朋友建議我使用scipyeuclidean方法,但我不知道如何使用它來構建矩陣,因此我沒有起點。我嘗試使用ego_graph(),但它沒有給我想要的結果。
任何幫助在解決我的問題表示讚賞。
在此先感謝。 (使用Ubuntu 14.04 32位虛擬機和Python 2.7)

+0

節點對(i,j)的距離與(j,i)的距離相同,並且顯然如果一個在範圍內,那麼將是另一個。當你保存你的數據時,你想要兩個結果嗎? – Reti43

+0

@ Reti43這是你所做的一個好點子。如果兩個結果都保存了,那麼它肯定會成爲矩陣。我假設如果我只保存一個結果,那麼它就像一個邊界列表。如果我能夠同時擁有這兩種產品,那麼最好能讓我選擇哪種產品最適合我的實驗。 – user136819

+0

還有一個問題,即使它可能不相關。 add_edge(id1,id2,weight)'添加節點的含義是什麼?你可以用'add_node()'簡單地添加一個節點,然後將該位置設置爲一個屬性,就像你之前描述的一個句子一樣。 – Reti43

回答

2

您可以使用scipy.spatial.distance.cdist()給定座標列表來生成距離矩陣。

顯然一個numpy數組總是0索引的,如果你的節點有隨機數,你想保留一個列表來知道你的矩陣的哪一行/哪一列對應哪一對。

之後你做了什麼應該是微不足道的,但我會根據你的描述給出一個例子。對於每個節點,在閾值距離內打印所述節點的ID和任何相鄰節點的ID。

import numpy as np 
from scipy.spatial import distance 

def neighbour_nodes_of(node, dist_matrix, distance): 
    row = dist_matrix[node] 
    return np.where((row <= distance) * (row > 0))[0] 

ids = [1, 2, 3, 4, 5] 
coords = [(21.5, 23), 
      (24.5, 20), 
      (19.5, 19), 
      (22.5, 15), 
      (24.5, 12), 
      ] 
threshold = 8. 

dist_matrix = distance.cdist(coords, coords) 

# this is something you can write to a file instead 
for i, node_id in enumerate(ids): 
    neighbours = neighbour_nodes_of(i, dist_matrix, threshold) 
    neighbour_ids = [ids[n] for n in neighbours] 
    print([node_id] + neighbour_ids) 
+0

另外,出於好奇(還有一點必要性),我還有另一個問題:我正在循環運行'nx.draw'和'plt.show()'以重新創建圖形中邊緣的添加和刪除(如電影)。但是這些循環會導致輸出與先前迭代中的所有邊和節點重疊,並污染不需要的輸出。您是否知道在每次迭代中「重繪」圖形的方法/方法,以避免上述問題?再次感謝您的幫助:) – user136819

+0

@MFHS有各種動畫顯示方法,最簡單的方法是在每個循環中調用'plt.cla()'以清除當前座標軸。 (你可能還需要調用'plt.gcf()。canvas.draw()')。如果你只是需要檢查一個短序列,但是隨着更多的重繪會變得越來越遲緩,這通常是可以的。如需更多選擇,請參閱[動畫API](https://matplotlib.org/api/animation_api.html) – Bonlenfum