两个矩阵之间的最短路径

时间:2016-07-24 20:40:20

标签: python-2.7 numpy pandas matrix networkx

我有两个重叠变量名称的距离矩阵。

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的最小值 - > ž。

但是因为我必须为大约30000件物品做这件事,所以需要很长时间。

有人知道如何以矢量化的方式做到这一点吗?

1 个答案:

答案 0 :(得分: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