创建以列-行对为键、矩阵中对应值为值的对称矩阵字典的高效方法

Efficient way to create dictionary of symmetric matrix with colum-row pair as key, and corresponding value in matrix as value

我想创建一个形式为(行,列)的字典:值,来自如下所示的对称矩阵(如距离矩阵),而不考虑 NaN 值或零(零是对角线)。矩阵是一个 pandas 数据框。

Material  100051    100120    100138    100179    100253    100265    100281                                                                         
100051       0.0  0.953488  0.959302  0.953488  0.959302  0.953488  0.953488   
100120       NaN  0.000000  0.965116  0.953488  0.959302  0.959302  0.959302   
100138       NaN       NaN  0.000000  0.959302  0.970930  0.970930  0.970930   
100179       NaN       NaN       NaN  0.000000  0.959302  0.953488  0.953488   
100253       NaN       NaN       NaN       NaN  0.000000  0.976744  0.976744   
...          ...       ...       ...       ...       ...       ...       ... 

所以字典看起来像:

{((100120, 100051): 0.953488); ((1000138, 100051): 0.959302); ....}

要创建字典,您可以像这样遍历行和列:

jacsim_values = {}
for i in jacsim_matrix2:
    for j in jacsim_matrix2:
        if jacsim_matrix[i][j] != 0:
            jacsim_values[i,j] = jacsim_matrix2[i][j]

但我正在寻找更高效的方法。对于矩阵的大小,这需要相当长的时间。但是,我找不到如何操作。有没有人可以帮助我?

IIUC,DataFrame.stack (row, column) or DataFrame.unstack (column, row) + DataFrame.to_dict

df.set_index('Material').rename(int, axis=1).unstack().to_dict()

{(100051, 100051): 0.0,
 (100051, 100120): nan,
 (100051, 100138): nan,
 (100051, 100179): nan,
 (100051, 100253): nan,
 (100120, 100051): 0.9534879999999999,
 (100120, 100120): 0.0,
 (100120, 100138): nan,
 (100120, 100179): nan,
 (100120, 100253): nan,
 (100138, 100051): 0.9593020000000001,
 (100138, 100120): 0.965116,
 (100138, 100138): 0.0,
 (100138, 100179): nan,
 (100138, 100253): nan,
 (100179, 100051): 0.9534879999999999,
 (100179, 100120): 0.9534879999999999,
 (100179, 100138): 0.9593020000000001,
 (100179, 100179): 0.0,
 (100179, 100253): nan,
 (100253, 100051): 0.9593020000000001,
 (100253, 100120): 0.9593020000000001,
 (100253, 100138): 0.97093,
 (100253, 100179): 0.9593020000000001,
 (100253, 100253): 0.0,
 (100265, 100051): 0.9534879999999999,
 (100265, 100120): 0.9593020000000001,
 (100265, 100138): 0.97093,
 (100265, 100179): 0.9534879999999999,
 (100265, 100253): 0.9767440000000001,
 (100281, 100051): 0.9534879999999999,
 (100281, 100120): 0.9593020000000001,
 (100281, 100138): 0.97093,
 (100281, 100179): 0.9534879999999999,
 (100281, 100253): 0.9767440000000001}