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

时间:2016-10-04 11:33:00

标签: python numpy

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

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

现在我创建了一个继承自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])

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

然而:

new_max_value = new_arr.max() # returns CustomArray(5)

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

同样,为什么arr == new_arrnew_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])

1 个答案:

答案 0 :(得分:2)

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

list.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, CalculateHowYouNeedToFitScreen));