Python numpy-ndarray子类:ufunc-don';t返回标量类型
对于Python numpy-ndarray子类:ufunc-don';t返回标量类型,python,numpy,subclass,scalar,multidimensional-array,Python,Numpy,Subclass,Scalar,Multidimensional Array,对于numpy.ndarray子类,ufunc输出具有相同的类型。这通常是好的,但我希望带有标量输出的ufunc返回标量类型(例如numpy.float64) 例如: import numpy as np class MyArray(np.ndarray): def __new__(cls, array): obj = np.asarray(array).view(cls) return obj a = MyArray(np.arange(5)) a*
numpy.ndarray
子类,ufunc输出具有相同的类型。这通常是好的,但我希望带有标量输出的ufunc返回标量类型(例如numpy.float64
)
例如:
import numpy as np
class MyArray(np.ndarray):
def __new__(cls, array):
obj = np.asarray(array).view(cls)
return obj
a = MyArray(np.arange(5))
a*2
# MyArray([0, 2, 4, 6, 8]) => same class as original (i.e. MyArray), ok
a.sum()
# MyArray(10) => same as original, but here I'd expect np.int64
type(2*a) is type(a.sum())
# True
b = a.view(np.ndarray)
type(2*b) is type(b.sum())
# False
对于标准numpy数组,标量输出具有标量类型。那么,如何使我的子类具有相同的行为呢
我在OSX 10.6上使用Python 2.7.3和numpy 1.6.2,您需要在ndarray子类中使用如下函数覆盖
\uuuuu数组\uu wrap\uuuu
:
def __array_wrap__(self, obj):
if obj.shape == ():
return obj[()] # if ufunc output is scalar, return it
else:
return np.ndarray.__array_wrap__(self, obj)
在ufuncs之后调用
\uuuu数组\uu wrap\uuu
,以执行清理工作。在默认实现中,在特殊情况下,使用精确的ndarrays(但不是子类)将零秩数组转换为标量。至少对于某些版本的numpy是这样。我不确定我是否理解:是否希望例如sum()
始终返回float64
,而不管a
是整数数组还是浮点数组?不,我希望它返回与a.view(np.ndarray).sum()相同的值
:具有与传统数组相同的行为。好吧,这很奇怪,因为当我运行代码时,a.sum()
对我来说是np.int64
。Python 2.7.5+NumPy 1.7.0以及Python 3.3.2+NumPy 1.8.0-dev。注意:您可能会混淆a.sum().dtype
和type(a.sum())
。我的结果与OP匹配,而不是@Evert。Numpy1.7.1
,Python2.7.5
。有趣的是,输出是压缩的,因为它具有shape()
而不是(1,)
,但它不是转换为标量。因此,如果类型不是ndarray
,则np.sum()
忽略keepdims
参数这一事实并不影响它。