2

我有以下课程:

class autoArray2(numpy.ndarray):
    def __new__(self, *args, **kwargs):
        obj = numpy.array(*args, **kwargs)
        return(obj)

    def __setitem__(self, coords, value):
        print("HERE")

但是,似乎array.__setitem__正在调用而不是我指定的那个。

a = numpy.array([[1,2],[2,3]])
b = autoArray2(a)
a[0,0] = 1

“这里”没有打印出来。

4

1 回答 1

3

子类化一个 numpy 数组有点棘手。 如果您想进行子类化, Stefan van der Walt 的幻灯片numpy 文档是很好的起点。

import numpy as np

class AutoArray2(np.ndarray):
    def __new__(cls, input_array):
        # Input array is an already formed ndarray instance
        # We first cast to be our class type
        obj = np.asarray(input_array).view(cls)
        return obj
    def __array_finalize__(self, obj):
        if obj is None: return
    def __setitem__(self, coords, value):
        print("HERE")

a = np.array([[1,2],[2,3]])
b = AutoArray2(a)
b[0,0] = 1

产量

HERE

关键因素是对view(cls). 没有它,您将返回一个普通的ndarray,而不是 AutoArray2 实例。

此外,a[0,0] = 1正在使用a-- 普通的ndarray. 要使用b__setitem__需要的b[0,0] = 1

于 2012-10-02T22:40:08.100 回答