【问题标题】:Subclassing numpy : numpy methods return ndarray instead of the sublassed type?子类化numpy:numpy方法返回ndarray而不是sublassed类型?
【发布时间】:2020-04-11 19:07:58
【问题描述】:

我能够继承 numpy :

class myary(np.ndarray):
def __new__(cls, arg1, arg2) : 
   .....
        obj = super(myary, cls).__new__(cls, shape=(arg1,), dtype=np.int)
        ....
        return obj

它有效,但问题是当我应用 numpy 函数时(如 np.concatenate()、np.stack() .... 等) 输出是 ndarray 而不是 myary。 我实现了__array_wrap__,所以 np.sort, np.add ... 工作,但不是我上面提到的那个。

def __array_wrap__(self, out_arr, context=None):
    return super(self.__class__, self).__array_wrap__(out_arr, context)

如何强制所有 numpy 方法返回我作为输入传递的任何内容。

【问题讨论】:

    标签: python numpy subclassing


    【解决方案1】:

    根据this scipy reference,适应class.__array_function__(func, types, args, **kwargs) 是NumPy 1.16 版的方法。该描述有一个有用的(虽然很少)示例,说明如何实现numpy.concatenatenumpy.broadcast_to,这让我很容易实现!以下是处理 numpy.concatenate 并返回您的类的实例的最简单(甚至更稀疏)的方法:

        import numpy as np
    
        class MyClass:
            def __array_function__(self, func, types, args, kwargs):
                if func == np.concatenate:
                    < do stuff here for concatenating your class >
                    return < result of stuff done of type MyClass>
                else:
                    return NotImplemented
    
    

    附带说明一下,当我实现np.concatenate 时,当我提供我的子类列表作为输入(而不是我的子类的实例)时,我对 numpy 如何知道调用我的方法感到困惑。我发现这很有帮助——每当调用 numpy 数组函数时都会调用此方法,并按如下方式决定是否使用您的实现(请注意,如果您不处理给定函数,则返回 NotImplemented 的重要性):

    1. NumPy 将收集所有__array_function__ 的实现 指定输入并按顺序调用它们:之前的子类 超类,否则从左到右。请注意,在某些边缘 涉及子类的案例,这与当前的略有不同 Python 的行为。
    2. __array_function__ 的实现表明它们可以通过返回除NotImplemented 之外的任何值来处理操作。
    3. 如果所有__array_function__ 方法都返回NotImplemented,NumPy 将引发TypeError

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 2013-10-13
      • 1970-01-01
      • 2013-04-14
      • 2011-09-05
      • 2016-11-03
      • 1970-01-01
      • 2022-06-12
      • 2016-02-01
      相关资源
      最近更新 更多