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!