让我们看一下 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)