2

对于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

4

1 回答 1

3

您需要__array_wrap__在 ndarray 子类中使用如下所示的函数进行覆盖:

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)

__array_wrap__在 ufuncs 之后调用以进行清理工作。在默认实现特殊情况下,精确的 ndarrays(但不是子类)将零秩数组转换为标量。至少对于某些版本的 numpy 来说是这样。

于 2013-11-01T04:35:43.197 回答