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でnumpy 1.6.2でPython 2.7.3を使用しています

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 の後に呼び出されます。デフォルトの実装では、ゼロランク配列をスカラーに変換するために、正確な ndarray (ただしサブクラスではない) の特別なケースがあります。少なくとも、これは numpy の一部のバージョンに当てはまります。

于 2013-11-01T04:35:43.197 に答える