2016-07-24 117 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 
相关问题