¿Cómo puedo crear mi propio tipo de datos en python para poder sobrescribir los operadores aritméticos?

Actualmente estoy usando Python / Numpy para tratar con datos geográficos / GPS (¡me encanta!), Y me enfrento a la tarea recurrente para calcular distancias entre puntos geográficos definidos por un par de coordenadaspn = [lon, lat].

Tengo una función que uso así:dist = geodistance(p1, p2) que es análoga a la distancia euclidiana en el álgebra lineal (resta / diferencia del vector), pero ocurre en el espacio geodésico (esférico) en lugar de en el espacio euclidiano rectangular.

Programáticamente, la distancia euclidiana está dada por

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

Matemáticamente, esto es equivalente a la oración "idiomática" (por falta de una palabra mejor)

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

Actualmente, obtengo mi distancia como esta:

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

>> 44.3904032407

Me gustaría hacer esto:

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

>> 44.3904032407

Y el objetivo final:

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

Algo similar es: si tomas dosdatetime objetos y restarlos, la operación devuelve untimedelta objeto. Quiero restar dos coordenadas y obtener una distancia geodésica como resultado.

Me pregunto si una clase funcionaría, pero dtype (un "subtipo" de float32, por ejemplo) ayudaría mucho en la creación de matrices a partir de listas (** que es cómo leo las cosas de los archivos XML).

¡Muchas gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta