Я использую scipy
и его функцию cdist
для вычисления матрицы расстояний из массива векторов.
import numpy as np
from scipy.spatial import distance
vectorList = [(0, 10), (4, 8), (9.0, 11.0), (14, 14), (16, 19), (25.5, 17.5), (35, 16)]
#Convert to numpy array
arr = np.array(vectorList)
#Computes distances matrix and set self-comparisons to NaN
d = distance.cdist(arr, arr)
np.fill_diagonal(d, None)
Допустим, я хочу вернуть все расстояния, которые ниже определенного порога(6
например)
#Find pairs of vectors whose separation distance is < 6
id1, id2 = np.nonzero(d<6)
#id1 --> array([0, 1, 1, 2, 2, 3, 3, 4])
#id2 --> array([1, 0, 2, 1, 3, 2, 4, 3])
Теперь у меня есть 2 массива индексов.
Вопрос : как я могу вернуть расстояния между этими парами векторов какмассив / список?
4.47213595499958 #d[0][1]
4.47213595499958 #d[1][0]
5.830951894845301 #d[1][2]
5.830951894845301 #d[2][1]
5.830951894845301 #d[2][2]
5.830951894845301 #d[3][2]
5.385164807134504 #d[3][4]
5.385164807134504 #d[4][3]
d[id1][id2]
возвращает матрицу, а не список, и единственный способ, который я нашел до сих пор, - это повторять итерацию по матрице расстояний, что не имеет смысла.
np.array([d[i1][i2] for i1, i2 in zip(id1, id2)])