Преобразование расстояния Винсенти в массив

Мой вопрос прост. Из geopy.distance я могу рассчитать расстояние между двумя точками. Но я не могу преобразовать формат данных для дальнейших вычислений.

Код такой:

from geopy.distance import vincenty
length = vincenty((38.103414282108375, 114.51898800000002),\
                  (38.07902986076924, 114.50882128404997))

ration = np.array(([2,2],[3,3]))*length 

Ошибка:

неподдерживаемые типы операндов для *: 'int' и 'vincenty'

Я попытался изменить Distance(xxx) на np.array: np.array(length), но не удалось. Он отображается как array(Distance(388.659276576), dtype=object), по-прежнему не поддерживает вычисления напрямую.


person Han Zhengzu    schedule 28.03.2016    source источник
comment
FWIW, если вы хотите использовать более стабильный и точный алгоритм, чем Vincenty, взгляните на превосходный C.F.F. Karney. Географическая библиотека. Некоторая информация также содержится в Геодезические на эллипсоиде Википедии; Карни является одним из основных авторов этой статьи и большинства других статей Википедии по геодезическим эллипсоидам.   -  person PM 2Ring    schedule 28.03.2016


Ответы (2)


Как указано в руководстве, вам нужно «экспортировать» ваше расстояние/винценты в какой-то формат. Например. как это:

> from geopy.distance import vincenty
> newport_ri = (41.49008, -71.312796)
> cleveland_oh = (41.499498, -81.695391)
> print(vincenty(newport_ri, cleveland_oh).miles)
538.3904451566326

Вы не можете обработать vincenty себя, потому что (как вы уже сказали) это объект вне геопии, который не поддерживает математические операнды. Вам нужно извлечь значения внутри объекта данных, например. с .miles. Другие возможные значения см. в полной документации: документация GeoPy

Смотрите различия в типах:

> type(vincenty(newport_ri, cleveland_oh))
geopy.distance.vincenty

> type(vincenty(newport_ri, cleveland_oh).miles)
float

Теперь вы можете рассчитать это:

> vincenty(newport_ri, cleveland_oh).miles
538.3904451566326

> vincenty(newport_ri, cleveland_oh).miles * 2
1076.7808903132652

Или, если вам действительно нужен массив numpy из этого:

> np.array(vincenty(newport_ri, cleveland_oh).miles)
array(538.3904451566326)

> type(np.array(vincenty(newport_ri, cleveland_oh).miles))
numpy.ndarray

EDIT: обратите внимание, что вы даже можете принудительно применить его тип данных с помощью встроенного параметра NumPy dtype:

> np.array(vincenty(newport_ri, cleveland_oh).miles, dtype=np.float32)
array(538.3904418945312, dtype=float32)

> np.array(vincenty(newport_ri, cleveland_oh).miles, dtype=np.float64)
array(538.3904451566326)  # dtype=float64, default type here

> np.array(vincenty(newport_ri, cleveland_oh).miles, dtype=np.int32)
array(538, dtype=int32)

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

person daniel451    schedule 28.03.2016
comment
Я думал об этом. Но я все еще не могу найти решение для сохранения содержимого print как np.array. - person Han Zhengzu; 28.03.2016
comment
Я добавил пример для этого. Тем не менее, я бы порекомендовал вам прочитать учебник по NumPy и/или Python, так как это действительно базовые знания. Если вы печатаете float с print(vincenty(newport_ri, cleveland_oh).miles), должно быть очевидно, что вы можете просто выполнить someVariable = vincenty(newport_ri, cleveland_oh).miles, чтобы получить это число с плавающей запятой и сохранить его в переменной для дальнейших вычислений (или в массиве numpy). - person daniel451; 28.03.2016
comment
Ничего страшного, пожалуйста. Не забудьте посмотреть несколько туториалов ;) - person daniel451; 28.03.2016
comment
Если вы загружаете/храните много значений и вам не нужна 64-битная (или даже более высокая) точность, вы можете сэкономить время вычислений, а также память, указав тип данных массива numpy. См. мое редактирование в моем посте. - person daniel451; 28.03.2016

vincenty((38.103414282108375, 114.51898800000002),\
                  (38.07902986076924, 114.50882128404997))

Это объект, и вы пытаетесь умножить объект другого типа. Я бы предложил сделать это

from geopy.distance import vincenty
length = vincenty((38.103414282108375, 114.51898800000002),\
                  (38.07902986076924, 114.50882128404997))
length = length.miles

ration = np.array(([2,2],[3,3]))*length 
person jayprakashstar    schedule 28.03.2016