簡體   English   中英

如何使math和numpy模塊中的現有函數支持用戶定義的對象?

[英]How do I make existing functions in math and numpy module support user-defined objects?

我定義了一個我想要基本操作(例如+- )以及更高級的數學操作(例如sin來支持的類。 也就是說,我需要為這些基本運算符和數學函數定義一些新規則。

我可以使用以下Python的魔術方法處理基本運算符,

class NewObj():

    def __init__(self, *args):
        pass

    def __add__(self, other):
        pass

    def __mul__(self, other):
        pass

    # Use magic methods to define other basic operators below...

而且我還可以在定義類NewObj的同一.py文件中重新定義基本功能,例如

def sin(x):
    pass

並將該文件命名為myoperator.py。 然后,我可以導入此模塊,並對NewObj對象應用新操作。


但是我還希望numpymath現有函數支持我的NewObj對象,以便math.sin()numpy.sin()也支持我新定義的NewObj對象。 我該如何實現?

另一個問題是:是否有可能像魔術方法一樣將函數封裝在NewObj類中,以便所有內容都寫入類數據結構中?

math模塊顯式地記錄諸如math.sin類的math.sin始終返回浮點數。 如果要讓math.sin(your_object)返回一個NewObj實例而不是float請不要這樣做 如果您使它工作,它將使所有人感到困惑,並且將導致初始化順序錯誤和其他麻煩。 (這是NumPy有其自己的numpy.sin而不是試圖使math.sin支持NumPy數組的原因。)

如果您對math.sin(your_object)返回浮點數沒問題,那么可以實現__float__方法將您的對象轉換為浮點數:

class NewObj(object):
    ...
    def __float__(self):
        return whatever

math.sin會將您的對象轉換為浮點數,計算該浮點數的正弦值,然后將其作為浮點數返回。


對於NumPy,只需實現一個sin方法:

class NewObj(object):
    ...
    def sin(self):
        return whatever

numpy.sin將委托給您的sin方法。 您可以讓它返回一個NewObj 無需強制浮動或其他任何操作。 大多數類似的NumPy函數將類似地委托給方法。 也就是說,嘗試在NumPy數組中使用自定義對象會削弱NumPy的大多數效率優勢,因此,如果要這樣做,您可能需要重新考慮設計。

您可以重新定義math模塊的sin

import math

class NewObj:
    pass

old_sin = math.sin

def new_sin(number):
    return 42.0 if isinstance(number, NewObj) else old_sin(number)

math.sin = new_sin

大概您用一個更有用的定義替換了42.0

希望在不久的將來不會出現__numpy_ufunc__特殊屬性(名稱可能會更改 )。 這是numpy docs 開發版本中的相關內容

class.__numpy_ufunc__(ufunc, method, i, inputs, **kwargs)

1.11版中的新功能。

任何類( 無論是否為ndarray子類 )都可以定義此方法來覆蓋NumPy的ufunc的行為。

[強調我的]

暫無
暫無

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

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