gpt4 book ai didi

python - 子类化 numpy.ma.MaskedArray

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:37 25 4
gpt4 key购买 nike

我正在尝试子类化 numpy 的 MaskedArray添加属性,但似乎无法获得正确的结果。

我开始关注 the example用于子类化 numpy.ndarray ,效果很好。

然后我尝试子类化 numpy.ma.MaskedArray相反,如下所示:

import numpy as np

class MyMaskedArray(np.ma.MaskedArray):

def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj.info = info
return obj

def __array_finalize__(self, obj):
if obj is None: return
self.info = getattr(obj, 'info', None)
super(MyMaskedArray, self).__array_finalize__(obj)

arr = np.arange(5)
obj = MyMaskedArray(arr, info='information')
print obj.info
print obj[1:].info

结果

information
None

我曾两次期待“信息”。

替换行 obj = np.asarray(input_array).view(cls)obj = np.ma.MaskedArray(input_array).view(cls)obj = np.ma.MaskedArray.__new__(cls, input_array)没有解决那个问题(我是这样走的,因为我想在子类的 future 化身中将 *args**kwargs 传递给 __new__。)

请注意,我还必须添加对 MaskedArray.__array_finalize 的调用在我的子类中'__array_finalize__ ,与 ndarray 的示例相反子类;如果我不这样做,_mask找不到属性。

也许有人可以启发我:

  • 如何获得 obj[1:].info保持原来的obj.info

  • 为什么 ndarray不需要父类(super class)调用 __array_finalize__ ,但是MaskedArray确实(更多的是奖励问题)。

我想继承MaskedArray而不是编写容器类,因为后者会失去一些 MaskedArray 带来的便利

(注意:这与 this question 不同,因为我已经“解决”了 __init__/__new__ 问题。)

最佳答案

为了让切片按照您的意愿工作,您可能需要重载 __getitem__:

def __getitem__(self, item):
out = np.ma.MaskedArray.__getitem__(self, item)
out.info = self.info
return out

__setitem__ 也是如此。

如果你的info属性比较简单,比如在你的例子中,你可能想看看MaskedArray_optinfo属性,这是为此目的而设计的:它只是一个字典,用于存储一些必须以某种方式保存的信息。这是一个例子:

class MyMaskedArray(np.ma.MaskedArray):

def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj._optinfo['info'] = info
return obj

@property
def info(self):
return self._optinfo.get('info', None)

注意这里,.info是一个只读属性,但是要让它可写很简单。

关于 __array_finalize__

我不确定我是否理解您的问题:ndarray 本身就是父类(super class)。 MaskedArrayndarray 的子类,因此需要定义一个 __array_finalize__ 方法来特别说明如何设置掩码(通过 _mask 参数)。检查这个link有关子类化的更多信息。

在您的示例中,您使用自己的 __array_finalize__ 来设置您的 .info 属性。在这种情况下,您必须调用父方法 MaskedArray.__array_finalize__,这是基本的 Python 子类化。请注意,如果您采用 _optinfo 方式,则不必显式定义 __array_finalize__...

注意

  • __array_prepare____array_wrap__ 方法实际上用于在应用函数之前准备 ndarray 子类的实例,并处理函数的结果

关于python - 子类化 numpy.ma.MaskedArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14564656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com