让我们看看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_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])
。
答案 0 :(得分:2)
在numpy docs之后:在numpy ufuncs和其他numpy函数的末尾调用 array_wrap ,以允许子类设置返回值的类型并更新属性和元数据。
list.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, CalculateHowYouNeedToFitScreen));