微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

最有效的方法是什么?我发现了一种方法,但它似乎不是最好的方法. NumPy或Pandas中有什么东西可以进行这种操作吗?还是只是一个更快的方式?我的方式是每循环1.46毫秒

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐