【问题标题】:Extract mask from numpy masked array using a logical expression使用逻辑表达式从 numpy 掩码数组中提取掩码
【发布时间】:2016-03-16 15:03:25
【问题描述】:

我正在尝试找到一种仅使用逻辑表达式从掩码数组中获取掩码的方法。因此,如果var 是一个掩码数组,我想通过将它与 nodata 对象、None 或类似的东西进行比较来获取掩码

>>> var = numpy.ma.masked_array([1, 2 , 3], mask=[True, False, True])
>>> print var == None
... False
>>> print var == numpy.ma.masked
... --

我想得到什么

>>> print var == ???
... array([ True, False,  True], dtype=bool)

我知道我可以通过var.mask 直接访问掩码,但在我的用例中我只能评估逻辑运算符,例如numpy.equal

知道我可以为??? 使用什么来获取面具吗?

【问题讨论】:

  • 右侧的内容是否有限制?例如,您可以编写一个定义为def __eq__(self, other): return other.mask 的自定义类吗?

标签: python numpy no-data


【解决方案1】:

如果fill_value 没有出现在数组中,这应该可以工作:

var.filled()==var.fill_value

掩码数组具有datamask(以及fill_value 等属性)。 data 是“原始的”,即与您在创建数组时提供的内容相同。因此,您可以测试mask 的唯一方法是直接查看mask,或者将掩码应用于数据,这就是filled 所做的。

精简,filled 确实:

m = self._mask
result = self._data.copy('K')
np.copyto(result, fill_value, where=m)

它会复制data,用fill 填充masked 值。

显然这是获取mask 的复杂方式。但是如果你不能直接获取掩码,你可以这样做。

您可以使用自己的fill_valuemasked .__eq__ 做了类似的事情(用 0 填充两边并执行正常的 __eq__

In [416]: var.filled(0)==0
Out[416]: array([ True, False,  True], dtype=bool)

查看ma 定义代码了解更多详情: /usr/lib/python3/dist-packages/numpy/ma/core.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    相关资源
    最近更新 更多