Как я могу создать свой собственный тип данных в Python, чтобы я мог перезаписать арифметические операторы?

В настоящее время я использую Python / Numpy для работы с географическими / GPS-данными (мне это нравится!), И я сталкиваюсь с повторяющейся задачей вычисления расстояний между географическими точками, определенными парой координат.pn = [lon, lat]

У меня есть функция, которую я использую следующим образом:dist = geodistance(p1, p2) который является аналогом евклидова расстояния в линейной алгебре (векторное вычитание / разность), но встречается в геодезическом (сферическом) пространстве вместо прямоугольного евклидова пространства.

Программно евклидово расстояние определяется как

dist = ((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)**0.5

Математически это эквивалентноидиоматическое» (из-за отсутствия лучшего слова) предложение

dist = p1 - p1   # the "norm" of the vector difference, subtraction.

В настоящее время я получаю свое расстояние следующим образом:

p1 = [-51.598354,-29.953363]
p2 = [-51.598701,-29.953045]
dist = geodistance(p1, p2)
print dist

>> 44.3904032407

Я хотел бы сделать это:

print p2 - p1  # these points now are from some fancy datatype

>> 44.3904032407

И конечная цель:

track = numpy.array([[-51.203018 -29.996149]
                     [-51.203018 -29.99625 ]
                     [-51.20266  -29.996229]
                     [-51.20229  -29.996309]
                     [-51.201519 -29.99416 ]], dtype=fancy)  # (**) or something like

print numpy.diff(track)

>> ndarray([[   0.        ]
            [   7.03531252]
            [  39.82663316]
            [  41.50958596]
            [ 172.49825765]])

Аналогичная вещь: если вы берете дваdatetime объекты и вычесть их, операция возвращаетtimedelta объект. Я хочу вычесть две координаты и в результате получить геодезическое расстояние.

Интересно, будет ли работать класс, но dtype (a "подтип» Например, из float32 очень помогли бы при создании массива из списков (**, как я читаю вещи из XML-файлов).

Большое спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос