为什么从 numpy 数组继承的类的方法返回不同的东西?

acd*_*cdr 5 python numpy

让我们看一下 numpy 数组的一些非常简单的行为:

import numpy as np
arr = np.array([1,2,3,4,5])
max_value = arr.max() # returns 5
Run Code Online (Sandbox Code Playgroud)

现在我创建一个继承自的类np.ndarray

class CustomArray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        obj = np.array(*args, **kwargs).view(cls)
        return obj
new_arr = CustomArray([1,2,3,4,5])
Run Code Online (Sandbox Code Playgroud)

我实际上并没有改变任何行为 - 我只是对对象的类进行了名义上的更改。

但是:

new_max_value = new_arr.max() # returns CustomArray(5)
Run Code Online (Sandbox Code Playgroud)

返回值是一个CustomArray实例?为什么?arr.max()没有返回np.ndarray实例,只是一个普通的 numpy 整数。

同样,为什么 和 都arr == new_arr返回new_arr == arr实例CustomArray?前者不应该调用arr.__eq__(new_arr),后者应该返回一个np.ndarray实例吗?

编辑:

__new__请注意,为了简单的构造函数,我重写了该方法。例如,相当于np.array([1,2,3,4,5])可以是CustomArray([1,2,3,4,5]),而如果我直接继承自,np.ndarray我就必须做类似的事情new_arr = CustomArray((5,))new_arr[:] = np.array([1,2,3,4,5])

小智 3

遵循 numpy 文档:array_wrap在 numpy ufuncs 和其他 numpy 函数的末尾被调用,以允许子类设置返回值的类型并更新属性和元数据。

class CustomArray(np.ndarray):
    def __new__(cls, a, dtype=None, order=None):
        obj = np.asarray(a, dtype, order).view(cls)
        return obj

    def __array_wrap__(self, out_arr, context=None):
        return np.ndarray.__array_wrap__(self, out_arr, context)

c = CustomArray([1,2,3,4])
c.max() # returns 4
Run Code Online (Sandbox Code Playgroud)