Numpy函数在ndarray

时间:2016-05-17 12:15:34

标签: python numpy

一些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,以防万一。)

1 个答案:

答案 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并使用它找到最大值。