Jak mogę utworzyć własny typ danych w Pythonie, aby móc nadpisać operatory arytmetyczne?

Obecnie używam Python / Numpy do obsługi danych geograficznych / GPS (uwielbiam to!) I stoję przed powtarzającym się zadaniem obliczania odległości między punktami geograficznymi zdefiniowanymi przez parę współrzędnychpn = [lon, lat].

Mam funkcję, której używam w ten sposób:dist = geodistance(p1, p2) który jest analogiczny do odległości euklidesowej w algebrze liniowej (odejmowanie / różnica wektorowa), ale występuje w przestrzeni geodezyjnej (sferycznej) zamiast prostokątnej przestrzeni euklidesowej.

Programowo, odległość euklidesowa jest podana przez

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

Matematycznie jest to odpowiednik zdania „idiomatycznego” (z braku lepszego słowa)

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

Obecnie otrzymuję taką odległość:

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

>> 44.3904032407

Chciałbym to zrobić:

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

>> 44.3904032407

I ostateczny cel:

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]])

Podobna rzecz: jeśli weźmiesz dwiedatetime obiekty i odjąć je, operacja zwraca atimedelta obiekt. Chcę odjąć dwie współrzędne i uzyskać w wyniku odległość geodezyjną.

Zastanawiam się, czy klasa mogłaby działać, ale dtype (na przykład „podtyp” float32) bardzo pomógłby w tworzeniu tablic z list (**, w jaki sposób czytam rzeczy z plików xml).

Wielkie dzięki!

questionAnswers(2)

yourAnswerToTheQuestion