Доступ к определенным попарным расстояниям в матрице расстояний (scipy / numpy) - PullRequest
1 голос
/ 25 октября 2019

Я использую 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)])

1 Ответ

2 голосов
/ 25 октября 2019

Использование

d[id1, id2]

Это форма, которую показывает пример numpy.nonzero (т. Е. a[np.nonzero(a > 3)]), который отличается от d[id1][id2], который вы используете.

См. arrays.indexing для более подробной информации о индексировании numpy.

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