numpy ndarray子类:ufunc不返回标量类型

2024-04-20 06:43:48 发布

您现在位置:Python中文网/ 问答频道 /正文

对于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数组,标量输出具有标量类型。那么如何对我的子类有相同的行为呢?在

我在OSX10.6上使用了Python2.7.3和Numpy1.6.2


Tags: numpyobj类型astypenp子类array
1条回答
网友
1楼 · 发布于 2024-04-20 06:43:48

您需要使用如下函数重写ndarray子类中的__array_wrap__,如下所示:

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

相关问题 更多 >