O.r*_*rka 6 python numpy distance matrix pandas
我正在为具有奇怪距离度量的东西做成对距离.我有一本字典{(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
Run Code Online (Sandbox Code Playgroud)
roo*_*oot 10
您可以使用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'))
Run Code Online (Sandbox Code Playgroud)
方法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'))
Run Code Online (Sandbox Code Playgroud)
方法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'))
Run Code Online (Sandbox Code Playgroud)
上述任何方法的结果输出:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |