Управление «словарём» поплавков и кортежей - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть несколько надуманный пример ниже, но он настолько минимален, насколько я мог бы получить.(sites и site_id_list намного, намного больше в моем реальном коде.) Но ключевая идея состоит в том, что у меня есть векторы положения (x, y, z), сохраненные для каждого сайта, и каждый сайт идентифицируетсяуникальный 2-кортеж, который я называю «id».

Я рассчитываю попарные расстояния между сайтами (запустите MWE ниже - он компилируется - и посмотрите на результат).Набор расстояний между парами сайтов имеет конечную длину (для контекста: потому что это позиции сайтов в правильном кристалле / решетке).В моем MWE есть 6 уникальных расстояний.

{0.3535533905932738, 0.7071067811865476, 0.6123724356957945, 1.0606601717798212, 0.9354143466934853, 0.7905694150420949}

Вопрос

Требуемый вывод - это способ отслеживать, какие пары сайтов (пары 2-кортежей ) принадлежат к тому расстоянию, которое их разделяет.

Я могу думать только об использовании словарной структуры, аналогичной:

{
'0.3535533905932738': [((0,0),(0,1)), ((0,0),(0,2)), ...],
'0.7071067811865476': [((0,0),(1,2)), ...],
...
}

, где идея "item "являющийся списком / набором пар из 2-х кортежей для каждого расстояния, который действует как" ключ ".

Проблемы здесь очевидны:

  1. Расчет расстояний может быть неточным и может незначительно отличаться (из-за арифметики с плавающей запятой), скажем, от 0,00001 << любого фактического расстояния между участками.Тогда их следует классифицировать как <em>такое же расстояние .

    . Например, пара сайтов ((0,0),(0,1)) может иметь расстояние 0.3535533905932738, а пара сайтов ((0,0),(0,2)) может иметь расстояние 0.3535533905932840, но я хочуОбе пары должны быть идентифицированы как имеющие одинаковое расстояние.Я предпочитаю сохранять точность сохраненных расстояний здесь (в предложенном вами решении) как можно выше, поскольку мне нужно будет использовать эти расстояния для последующих вычислений.

  2. Плавающие в качестве ключейсловарь не идеален ...

Какую структуру данных использовать здесь, если не словарь?Мне нужны как (i) расстояния (с максимально возможной точностью), так и (ii) связанные пары кортежей, которые дают эти расстояния.


MWE:

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)

пс.Как представление о масштабе, у меня может быть более 1000 таких сайтов, поэтому количество пар порядка N ^ 2, а различные расстояния могут составлять ~ 100 (я не уверен ..).Поэтому я был бы признателен, если бы в ответе можно было также упомянуть немного об эффективности, но не обязательно.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...