我在下面有一个人为的例子,但是我所能做到的却是最小的。 (sites
和site_id_list
在我的实际代码中要大得多。)
但是关键思想是我为每个站点存储了位置矢量(x,y,z),并且每个站点都由一个唯一的2元组(称为“ id”)来标识。
我正在计算站点之间的成对距离(运行下面的MWE-它是可编译的-并查看输出)。 位点对之间的距离集具有有限的长度(在上下文中:因为它们是规则晶体/晶格中位点的位置)。在我的MWE中,有 6 个唯一的距离。
{0.3535533905932738, 0.7071067811865476, 0.6123724356957945, 1.0606601717798212, 0.9354143466934853, 0.7905694150420949}
所需的输出是一种跟踪哪些站点对(两元组对)属于哪个距离的方法。
我只能想到使用字典结构,类似于:
{
'0.3535533905932738': [((0,0),(0,1)), ((0,0),(0,2)), ...],
'0.7071067811865476': [((0,0),(1,2)), ...],
...
}
这里的想法是“项目”是每个距离的一组成对的2元组的列表/集合,充当“键”。
这里的问题很明显:
距离的计算可能不精确,并且可能会略有不同(由于浮点运算),例如,两点之间的实际距离为0.00001 <<。然后应将它们分类为相同距离。
例如站点对((0,0),(0,1))
可能有距离0.3535533905932738
,站点对((0,0),(0,2))
可能有距离0.3535533905932840
,但我希望这两对仍然被识别为具有相同距离。我宁愿保持此处保存的距离(在您建议的解决方案中)的精度尽可能高,因为我将需要使用这些距离进行以后的计算。
将浮点数作为字典的键是不理想的...
如果不是字典,在这里使用什么合适的数据结构?我既需要(i)距离(以尽可能高的精度),也需要(ii)引起这些距离的相关的元组对。
import itertools as it
import numpy as np
sites = np.array([[[0, 0, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1]],
[[2, 2, 0], [3, 3, 0], [3, 2, 1], [2, 3, 1]],
[[2, 0, 2], [3, 1, 2], [3, 0, 3], [2, 1, 3]],
[[0, 2, 2], [1, 3, 2], [1, 2, 3], [0, 3, 3]]
]) / 4
site_id_list = [(i, j) for i, j in it.product(range(4), range(4))]
# calculate distances between site pairs
dist = set()
for id1, id2 in it.combinations(site_id_list, 2):
separation_vec = sites[id1] - sites[id2]
separation_dist = np.sqrt(separation_vec.dot(separation_vec))
dist.add(separation_dist)
print(dist)
ps。从规模上看,我可能有1000+个这样的站点,所以对的数量是N ^ 2阶,并且不同的距离可能在〜100之内(我不确定。)。 因此,如果答案也能提及效率,但并非绝对必要,我将不胜感激。谢谢。