2016-03-30 196 views
3

我有一個NxN常規網絡,其中每個節點有一組(X,Y)座標。節點由單元分隔。該網絡是這樣的:Python:如何計算常規網絡的歐氏距離分佈?

(0,0) (1,0) (2,0) 
(0,1) (1,1) (2,1) 
(0,2) (1,2) (2,2) 

我希望能夠計算到所有其他系統從每個節點歐氏距離。例如:

#Euclidean distances from node (0,0): 
0   sqrt(1)  sqrt(4) 
sqrt(1) sqrt(2)  sqrt(5) 
sqrt(4) sqrt(5)  sqrt(8) 

然後,我想繪製距離分佈,它告訴我哪個頻率給定的距離有一定的值。然後,我想要將圖形變成對數對數圖。

這是我的嘗試:

import networkx as nx 
from networkx import * 
import matplotlib.pyplot as plt 

#Creating the regular network  
N=10 #This can vary 
G=nx.grid_2d_graph(N,N) 
pos = dict((n, n) for n in G.nodes()) 
labels = dict(((i, j), i + (N-1-j) * N) for i, j in G.nodes()) 
nx.relabel_nodes(G,labels,False) 
inds=labels.keys() 
vals=labels.values() 
inds.sort() 
vals.sort() 
pos2=dict(zip(vals,inds)) #Dict storing the node coordinates 
nx.draw_networkx(G, pos=pos2, with_labels=False, node_size = 15) 

#Computing the edge length distribution 
def plot_edge_length_distribution(): #Euclidean distances from all nodes 
lengths={} 
for k, item in pos2: 
    for t, elements in pos2: 
     if k==t: 
      lengths[k]=0 
     else: 
      lengths[k]=((pos2[t][2]-pos2[k][2])**2)+((pos2[t][1]-pos2[k][1])**2) #The square distance (it's ok to leave it like this) 
items=sorted(lengths.items()) 
fig=plt.figure() 
ax=fig.add_subplot(111) 
ax.plot([k for (k,v) in items],[v for (k,v) in items],'ks-') 
ax.set_xscale("log") 
ax.set_yscale("log") 
title_string=('Edge Length Distribution') 
subtitle_string=('Lattice Network | '+str(N)+'x'+str(N)+' nodes') 
plt.suptitle(title_string, y=0.99, fontsize=17) 
plt.title(subtitle_string, fontsize=9) 
plt.xlabel('Log l') 
plt.ylabel('Log p(l)') 
ax.grid(True,which="both") 
plt.show() 

plot_edge_length_distribution() 

編輯

運行時,這個腳本拋出錯誤:TypeError: 'int' object is not iterable,在那裏我寫for k, item in pos2:線指向。 我哪裏錯了?

回答

1

功能scipy.spatial.distance.pdist可以做到這一點儘可能有效。

考慮以下幾點:

from scipy.spatial import distance 
import numpy as np 

coords = [np.array(list(c)) for c in [(0,0),(1,0), (2,0)]] 
>>> distance.pdist(coords) 
array([ 1., 2., 1.]) 

該函數返回的距離矩陣的右上部分 - 對角線爲0,和左下部分可以從轉置來獲得。

例如,上面的對應於

0 1 2 
1 0 1 
2 1 0 

  • 0對角線和一切其較低的左去除。

  • 右上角「變平」爲[1,2,1]。

從平坦的結果重建距離並不困難。

+0

我喜歡這個,但我想有一些缺失。假設你有一個NxN節點的網絡:在這種情況下,我希望生成你描述的那種'(N-1)×(N-1)'矩陣。但在你的例子中,我沒有看到從哪個參考節點計算距離'1.','2'等。你明白我的意思嗎? – FaCoffee

+1

但是* N X N *個節點的網絡僅僅意味着有* m = N^2 *個節點,不是?所以距離的數量是[m選擇2](https://en.wikipedia.org/wiki/Binomial_coefficient)。我錯過了什麼嗎? –

+0

是的,我錯了。距離的總數是m選擇2.這意味着我們可以選擇2個距離矩陣。但是我的問題是:從'distance.pdist(coords)'得到的值'1.','2'等等是什麼節點 - 指的是?因爲如果起始節點是'(0,0)',我希望將其作爲輸出數組([0.,1,2。])'。 – FaCoffee