我目前使用Python/Numpy來處理地理/ GPS數據(喜歡它!),並且我正在面臨重複性任務來計算由座標對pn = [lon, lat]
定義的地理點之間的距離。如何在python中創建自己的數據類型以便覆蓋算術運算符?
我有一個函數,我這樣使用: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(例如float32的「子類型」)在從列表創建數組時會有很大幫助(**這是我從XML文件中讀取數據的方式)。
非常感謝!
調查運算符重載。 –
你可以繼承子類ndarray來重載minus操作符,但在做一些可能會讓人困惑的事情之前,我會考慮三次。也可以添加一個新的方法,比如'.dist()'當然。 numpy文檔有一些簡單的例子。只需添加一個方法,你不需要做太多的工作,否則可能會有點棘手。 – seberg
numpy.array(...,dtype = fancy)會帶來一個問題,那就是你會失去numpy的速度,因爲它會考慮python對象的數組而不是數字。也許你想有一個有時包含一對數字並有時包含一對數組的Coord類型。 –