У меня есть два списка l1
и l2
, содержащие целые числа, которые могут иметь разную длину, и я хочу выполнить вычисление между всеми возможными парами между этими двумя векторами.
В частности, я проверяю расстояние Хэмминга между каждой парой и, если расстояние достаточно мало, я хочу его «посчитать».
Наивно, это можно реализовать
def hamming_distance(n1: int, n2: int) -> float:
return bin(n1 ^ n2).count('1')/32.0
matches = 0
for n1 in l1:
for n2 in l2:
sim = 1 - hamming_distance(n1, n2)
if sim >= threshold:
matches += 1
Но это не очень быстро.
Я безуспешно пытался использовать scipy.spatial.distance.cdist
, где я решил, что сначала вычислю расстояние Хемминга между всеми парами, так как документация scipy.spatial.cdist заявляет , что это будет
Вычислить расстояние между каждой парой из двух наборов входных данных.
и затем подсчитать количество элементов, удовлетворяющих предикату, что 1 - d >= threshold
, где d
- этоРасстояние Хэмминга, т.е.
from scipy.spatial.distance import cdist
l1 = l1.reshape(-1, 2) # After np.array
l2 = l2.reshape(-1, 2)
r = cdist(l1, l2, 'hamming')
matches = np.count_nonzero(1 - r >= threshold)
, но количество совпадений, найденных соответствующими решениями, различается.Я заметил, что можно вызывать cdist
с функцией cdist(XA, XB, f)
, но мне не удалось написать мою реализацию hamming_distance
, чтобы она правильно вещала.
Я смотрел на этот вопрос / ответ , но он предполагает, что оба списка имеют одинаковую длину, что здесь не так.