2016-07-24 68 views
3

我有兩個重疊變量名稱的距離矩陣。兩個矩陣之間的最短路徑

DFA:

Start A1 A2 A3 A4 … A150 
Location       
A   12 4 12 2  9 
B   5 2 19 4  3 
C   1 4 8 7  12 

DFB:

A B C   
X 4 12 32   
Y 1 6 12   
Z 2 8,5 11 
從開始A1,A2等通過ABC有路徑X,Y和Z

我想

所以看看什麼是一個項目的最短路徑,例如組合A1 - > Z.我通過加載距離矩陣的csv並對它們進行拆分來編程。然後用df.itterows()和兩個for循環循環遍歷可能的組合,並查看組合A1 - > Z的最小值。

但是由於我必須對30000個左右的項目執行此操作,因此需要長。

任何人都知道如何以矢量化的方式做到這一點?

+4

新增networkx標籤,可能是這樣的路徑有關的問題有幫助。 – Divakar

+0

我忘了,謝謝! – Uis234

+0

保證這隻需要2步? A1到B到A3到C到X是不好的? – Joel

回答

0

我加了D,這樣軸長就會有所不同(dfB不會是方形矩陣),只是爲了我的方便(它也適用於矩形矩陣)。

import pandas as pd 
import numpy as np 
df_a = pd.read_csv('dfA.csv', delim_whitespace=True, index_col=0, decimal=",") 
df_b = pd.read_csv('dfB.csv', delim_whitespace=True, index_col=0, decimal=",") 
mat_a = df_a.values 
mat_b = df_b.values 
mat_a2 = np.expand_dims(mat_a, axis=2) 
mat_b2 = np.expand_dims(mat_b.T, axis=1) 
mat_a3 = np.tile(mat_a2, (1, 1, mat_b.shape[0])) 
mat_b3 = np.tile(mat_b2, (1, mat_a.shape[1], 1)) 
tot = mat_a3 + mat_b3 
ind = np.argmin(tot, axis=0).T 
df_c = pd.DataFrame(df_b.columns.values[ind], columns=df_a.columns, index=df_b.index) 
print(df_c) 

DFA:

Start_Location A1 A2 A3 A4 A150 
A    12 4 12 2  9 
B    5 2 19 4  3 
C    1 4 8 7  12 
D    5 2 9 11  4 

DFB:

A B C D 
X 4 12 32 11,4 
Y 1 6 2 9,3 
Z 2 8,5 11 1,4 

DFC:

A1 A2 A3 A4 A150 
X A A A A A 
Y C A C A B 
Z D D D A D 
相關問題