一些numpy函数(逻辑上)返回标量:
>>> my_arr = np.ndarray(shape=(1,))
>>> type(np.max(my_arr))
<type 'numpy.float64'>
但仅在使用ndarray调用时,而不是使用子类调用:
>>> class CustomArray(np.ndarray):
... pass
>>> my_arr = CustomArray(shape=(1,))
>>> type(np.max(my_arr))
<class '__main__.CustomArray'>
这是为什么?我希望两者都返回一个标量(类型为<type 'numpy.float64'>
,或前者返回np.ndarray
实例,后者返回CustomArray
实例。但相反,我得到一个这两种行为的结合。我可以通过改变自己的类来改变这种行为吗?
我没有在讨论子类化ndarray(http://docs.scipy.org/doc/numpy-1.9.2/user/basics.subclassing.html)的doc页面上看到任何可以解释这一点的内容。
(运行Python 2.7.10,numpy 1.9.2,以防万一。)
答案 0 :(得分:1)
这是因为max()
中的CustomArray
没有超载。如果您尝试它,my_array.max()
将返回CustomArray的对象而不是标量。
my_array = CustomArray(shape=(1,))
print my_array.max()
>> CustomArray(9.223372036854776e+18)
np.max
内部调用np.amax
,最终调用np.maximum.reduce
。这是map-reduce的标准reduce
并返回max返回的基础对象。因此,np.max
返回的类型实际上是在对象上调用的max()
方法返回的类型。您可以将其覆盖为:
class CustomArray(np.ndarray):
def max(self, axis, out):
return np.ndarray(self.shape, buffer=self).max(axis, out)
type(np.max(my_arr))
>> numpy.float64
诀窍是将自我向上转换为np.ndarray
并使用它找到最大值。