Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy-ndarray子类:ufunc-don';t返回标量类型_Python_Numpy_Subclass_Scalar_Multidimensional Array - Fatal编程技术网

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。Numpy
1.7.1
,Python
2.7.5
。有趣的是,输出是压缩的,因为它具有shape
()
而不是
(1,)
,但它不是转换为标量。因此,如果类型不是
ndarray
,则
np.sum()
忽略
keepdims
参数这一事实并不影响它。