【发布时间】:2013-10-13 23:20:30
【问题描述】:
对于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
【问题讨论】:
-
我不确定我是否理解:你想拥有例如
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。 Numpy
1.7.1,Python2.7.5。有趣的是,输出被压缩了,因为它的形状为()而不是(1,),但它没有转换为标量。因此,如果类型不是ndarray,np.sum()会忽略keepdims参数这一事实不会影响。
标签: python numpy subclass scalar multidimensional-array