Манхэттен Расстояние между (P, Q) и (R,) - PullRequest
0 голосов
/ 29 октября 2018

Я работаю на Манхэттене. Хорошо работает с простым циклом for. Но я пытаюсь избежать этого для цикла.

import numpy as np
import random
A = np.random.randint(5, size=(10, 5))
B = [1, 3, 5, 2, 4]
for i in range(10):
    dist = sum(abs(A[i]-B))
    print("Distances: ", dist)

Есть ли оптимальный путь, чем этот? такие как использование расширенного индексирования .. Спасибо за руководство.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Не могли бы вы использовать радианы или градусы и рассчитать результат? Это должно работать для вас.

from math import sin, cos, sqrt, atan2, radians

# approximate radius of earth in km
R = 6373.0

lat1 = radians(40.7619087)
lon1 = radians(-73.9690218)
lat2 = radians(40.760178)
lon2 = radians(-74.0037083)

dlon = lon2 - lon1
dlat = lat2 - lat1

a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * atan2(sqrt(a), sqrt(1 - a))

distance = R * c

print("Result:", distance)
print("Should be:", distance, "mi")
0 голосов
/ 29 октября 2018

Чистый numpy

Вы можете сделать это в numpy:

>>> np.sum(np.abs(A-B), axis=1)
array([10,  6,  9,  9,  7,  7,  9,  8, 14,  8])

Сравните это с выводом вашего цикла:

Distances:  10
Distances:  6
Distances:  9
Distances:  9
Distances:  7
Distances:  7
Distances:  9
Distances:  8
Distances:  14
Distances:  8

Альтернатива: scipy

Вы также можете использовать scipy, если хотите (лично я предпочитаю метод numpy):

from scipy.spatial.distance import cdist

>>> cdist(A,np.array(B).reshape(1,-1), metric='cityblock')
array([[10.],
       [ 6.],
       [ 9.],
       [ 9.],
       [ 7.],
       [ 7.],
       [ 9.],
       [ 8.],
       [14.],
       [ 8.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...