gpt4 book ai didi

python - 在 Pandas 中将字典转换为对称/距离矩阵的最有效方法

转载 作者:行者123 更新时间:2023-12-04 13:57:56 25 4
gpt4 key购买 nike

我正在为具有奇怪距离度量的东西做成对距离。我有一本字典,如 {(key_A, key_B):distance_value}我想做一个对称的 pd.DataFrame像距离矩阵。

执行此操作的最有效方法是什么?我找到了一种方法,但这似乎不是最好的方法。 NumPy里面有什么吗?或 Pandas有这种操作吗?或者只是一个更快的方法?我的方式是1.46 ms per loop

np.random.seed(0)
D_pair_value = dict()
for pair in itertools.combinations(list("ABCD"),2):
D_pair_value[pair] = np.random.randint(0,5)
D_pair_value
# {('A', 'B'): 4,
# ('A', 'C'): 0,
# ('A', 'D'): 3,
# ('B', 'C'): 3,
# ('B', 'D'): 3,
# ('C', 'D'): 1}
D_nested_dict = defaultdict(dict)
for (p,q), value in D_pair_value.items():
D_nested_dict[p][q] = value
D_nested_dict[q][p] = value

# Fill diagonal with zeros
DF = pd.DataFrame(D_nested_dict)
np.fill_diagonal(DF.values, 0)
DF

enter image description here

最佳答案

您可以使用 scipy.spatial.distance.squareform ,它转换距离计算的向量,即 [d(A,B), d(A,C), ..., d(C,D)] , 进入你正在寻找的距离矩阵。

方法 1:存储在列表中的距离

如果您按顺序计算距离,就像在示例代码和示例距离向量中一样,我会避免使用字典并将结果存储在列表中,然后执行以下操作:

from scipy.spatial.distance import squareform

df = pd.DataFrame(squareform(dist_list), index=list('ABCD'), columns=list('ABCD'))

方法 2:存储在字典中的距离

如果您乱序计算并且需要字典,您只需要获得一个正确排序的距离向量:
from scipy.spatial.distance import squareform

dist_list = [dist[1] for dist in sorted(D_pair_value.items())]
df = pd.DataFrame(squareform(dist_list), index=list('ABCD'), columns=list('ABCD'))

方法 3:存储在排序字典中的距离

如果需要字典,请注意有一个名为 sortedcontainers 的包。其中有一个 SortedDict 这基本上可以为您解决排序问题。要使用它,您需要更改的只是初始化 D_pair_value作为 SortedDict()而不是 dict .使用您的示例设置:
from scipy.spatial.distance import squareform
from sortedcontainers import SortedDict

np.random.seed(0)
D_pair_value = SortedDict()
for pair in itertools.combinations(list("ABCD"),2):
D_pair_value[pair] = np.random.randint(0,5)

df = pd.DataFrame(squareform(D_pair_value.values()), index=list('ABCD'), columns=list('ABCD'))

以上任何方法的结果输出:
     A    B    C    D
A 0.0 4.0 0.0 3.0
B 4.0 0.0 3.0 3.0
C 0.0 3.0 0.0 1.0
D 3.0 3.0 1.0 0.0

关于python - 在 Pandas 中将字典转换为对称/距离矩阵的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39004152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com