Нахождение расстояния 5-й ближайшей точки до каждой из точек в списке точек - PullRequest
0 голосов
/ 21 марта 2019
 xy[0].sort()
 DT=[]
 for i in range(5982):
       xf=np.abs(xy[0][i]-xy[0][i+1])
       yf=np.abs(xy[1][i]-xy[1][i+1])
       D=((xf**2)+(yf**2))**0.5
       DT.append(D)`

 DT.sort()
 R5=[]
 for i in range(5977):
    R=np.abs(DT[i]-DT[i+4])
    R5.append(R)`

Как следует из названия, я пытаюсь найти 5-ую ближайшую точку к каждой из точек в списке xy, которая состоит из всех точек в форме (2,5983), однако метод Im, использующий возврат5-е ближайшее расстояние без учета точек в направлениях х и у.Любая помощь в решении этой проблемы будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 21 марта 2019

Если я правильно понимаю, что вы хотите, это должно дать вам индекс 5-го ближайшего:

fifth = []
for i in range(len(xy)):
    distances = ((xy.T-xy.T[i])**2).sum(axis=1)
    fifth.append(np.argsort(distances)[5])

Это работает, если xy находится в форме (образцы, размеры), поэтому я использую транспорт. В противном случае это делает итерации менее читабельными. Но вы можете изменить это. Вы рассчитываете все расстояния на единицу, нет необходимости выполнять sqrt, потому что sqrt является монотонным, и вы ищете только заказ. Затем я использую 6-й элемент (индекс 5), потому что для простоты я не пропускаю самость, которая будет на расстоянии 0. Надеюсь, это поможет и ясно

0 голосов
/ 21 марта 2019

Стараемся не слишком сильно менять свой код. Первая часть вычисляет квадрат расстояния между каждой парой точек (как указывает Такратис, квадратный корень является монотонным). Затем он находит пятую ближайшую точку к каждой точке и возвращает массив, в котором i th элемент является пятой ближайшей точкой в ​​точке i.

DT = []
    for i in range(5983):
        d_i = []
        for j in range(5983):
            xf=np.abs(xy[0][i]-xy[0][j])
            yf=np.abs(xy[1][i]-xy[1][j])
            d_ij =(xf**2)+(yf**2)
            d_i.append(d_ij)
        DT.append(d_i)

R5 = []
for i in range(5983):
    R = DT[i].index(sorted(DT[i])[5]) 
    R5.append(R)

print R5 
0 голосов
/ 21 марта 2019

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

from scipy.spatial.distance import pdist,squareform
Y = pdist(xy, 'euclidean')

Пример:

>>a = [[1,2],[3,4],[5,6]]
>>Y = pdist(a, 'euclidean')
>>Y
array([2.82842712, 5.65685425, 2.82842712])

Первый элемент - это расстояние между a0 и a1, второй - это расстояние между a0 и a2, а третий - расстояние междуa1 и a2.

Или вы можете использовать квадратную форму:

>>square = squareform(pdist(a))
>>square
array([[0.        , 2.82842712, 5.65685425],
       [2.82842712, 0.        , 2.82842712],
       [5.65685425, 2.82842712, 0.        ]])

После этого используйте:

np.argsort(square)

И вы получите то, что хотите.

Проверьте документацию pdist .

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