簡體   English   中英

如何在python中創建自己的數據類型,以便我可以覆蓋算術運算符?

[英]How can I create my own datatype in python so that I could overwrite arithmetic operators?

我目前正在使用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(例如float32的“子類型”)將對列表中的數組創建有很大的幫助(**這就是我從xml文件中讀取內容的方式)。

非常感謝!

Python語言參考,§3.4.8, “模擬數字類型”

具體來說, __sub__()

您可以通過創建類並編寫__add____sub__方法來定義自己的類型。

例如:

class P(object):
    def __init__(self, lon, lat):
        self.lon = lon
        self.lat = lat

    def __sub__(self, other):
        dist = ((other.lon - self.lon)**2 + (other.lat - self.lat)**2)**0.5
        return dist

鑒於您目前正在使用列表索引語法獲取點的坐標,您還可以實現這些:

class P(object):
    def __init__(self, lon, lat):
        self.lon = lon
        self.lat = lat

    def __sub__(self, other):
        dist = ((other[0] - self[0])**2 + (other[1] - self[1])**2)**0.5
        return dist

    def __getitem__(self, key):
        if key == 0:
            return self.lon
        elif key == 1:
            return self.lat
        else:
            raise IndexError

    def __setitem__(self, key, value):
        if key == 0:
            self.lon = value
        elif key == 1:
            self.lat = value
        else:
            raise IndexError

(我意識到上述可能不是最優雅的方式)。

這樣,您的新課程就是您當前使用的列表的替代品。

Python文檔包含有關為創建用戶定義類型而需要編寫的雙下划線方法的更多信息。 (您正在尋找的信息大約在頁面的一半處開始)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM