ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-如何继承numpy.`ma.core.masked_array`?

2019-11-27 15:56:33  阅读:743  来源: 互联网

标签:python-2-7 oop inheritance subclass python


我正在尝试编写一个masked_array的子​​类.到目前为止,我得到的是:

class gridded_array(ma.core.masked_array):
    def __init__(self, data, dimensions, mask=False, dtype=None,
                 copy=False, subok=True, ndmin=0, fill_value=None,
                 keep_mask=True, hard_mask=None, shrink=True):
        ma.core.masked_array.__init__(data, mask, dtype, copy, subok,
                                      ndmin, fill_value, keep_mask, hard_mask,
                                      shrink)
        self.dimensions = dimensions

但是,当我现在创建gridded_array时,却没有得到期望的结果:

dims = OrderedDict()
dims['x'] = np.arange(4)
gridded_array(np.random.randn(4), dims)

masked_array(data = [-- -- -- --],
             mask = [ True  True  True  True],
             fill_value = 1e+20)

我希望有一个未屏蔽的数组.我怀疑传递给我的Dimensions参数是在masked_array .__ init__调用中传递的,但是由于我对OOP还是很陌生,所以我不知道如何解决这个问题.

任何帮助是极大的赞赏.

PS:我使用的是Python 2.7

解决方法:

一个警告:如果您是OOP的新手,那么到目前为止,子类化ndarrays和MaskedArrays并不是最简单的入门方法.

首先,您应该检查tutorial.这应该向您介绍子数组ndarrays涉及的机制.

与ndarrays一样,MaskedArrays使用__new__方法创建类实例,而不是__init__.到子类的__init__时,您已经有了一个完全实例化的对象,并将实际的初始化委托给__array_finalize__方法.简单来说:__init__不能像使用标准Python对象所期望的那样工作. (实际上,我不知道它是否被调用过……__array_finalize__之后,如果我没记错的话……)

受到警告后,您可能需要考虑是否真的需要经历子类化ndarray的麻烦:

>您的gridded_array的目标是什么?
>您应该支持所有ndarray方法,还是仅支持某些方法?所有dtypes?
>当您采用单个元素或对象的一部分时会发生什么?
>您会广泛使用gridded_arrays作为NumPy函数的输入吗?

如果您有疑问,那么将gridded_array设计为以ndarray(或MaskedArray)为属性的通用类(例如gridded_array._array),并仅添加您需要对自身进行操作的方法,可能会更容易. ._array.

意见建议

>如果仅需要“标记” gridded_array的每个项目,则可能对pandas感兴趣.
>如果只需要处理浮点数,那么MaskedArray可能会有点过大:仅使用nans表示无效数据,许多numpy函数具有与nans等效的功能.最糟糕的是,您总是可以在需要时遮罩gridded_array:使用.view(np.ma.MaskedArray)查看ndarray的子​​类应该返回输入的遮罩版本…

标签:python-2-7,oop,inheritance,subclass,python
来源: https://codeday.me/bug/20191127/2075379.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有