屏蔽值 (astropy.utils.masked )#

通常,数据集是不完整或损坏的,能够屏蔽某些值将是很方便的。Astropy提供了一个 Masked 类来帮助表示此类数据集。

警告

Masked 是试验性的!虽然我们希望基本用法保持不变,但我们还不确定是否没有必要改变它,以使事情在整个Astropy中正常运行。这也意味着我们特别欢迎对改进的意见和建议!

备注

Masked 与Numpy的相似 MaskedArray ,但它对子类的支持要好得多,并且还具有一些重要的 differences in behaviour 。因此,内部函数的行为 numpy.ma 定义不明确,应该改用Regular numpy 函数,这些函数被重写以正确使用掩码(带有中记录的不明显的选择 astropy.utils.masked.function_helpers ;请报告不能正常使用的NumPy函数 Masked 价值观!)。

用法#

阿斯特罗比 Masked 实例的行为类似于 ndarray 或子类,如 Quantity 但带有关联的掩码,该掩码在加法等操作中传播::

>>> import numpy as np
>>> from astropy import units as u
>>> from astropy.utils.masked import Masked
>>> ma = Masked([1., 2., 3.], mask=[False, False, True])
>>> ma
MaskedNDArray([1., 2., ——])
>>> mq = ma * u.m
>>> mq + 25 * u.cm
<MaskedQuantity [1.25, 2.25,  ———] m>

您可以使用以下命令获取不带掩码的值 unmasked ,或者,如果您需要控制应该用什么来替换任何掩码值,请使用 filled() **

>>> mq.unmasked
<Quantity [1., 2., 3.] m>
>>> mq.filled(fill_value=-75*u.cm)
<Quantity [ 1.  ,  2.  , -0.75] m>

对于求和之类的减法,掩码传播时就像直接计算求和一样:

>>> ma = Masked([[0., 1.], [2., 3.]], mask=[[False, True], [False, False]])
>>> ma.sum(axis=-1)
MaskedNDArray([——, 5.])
>>> ma.sum()
MaskedNDArray(——)

您可能想知道为什么被屏蔽的元素被传播,而不是被跳过(如中所述 MaskedArray ;请参阅 below )。其基本原理是,除非知道屏蔽元素的数量,否则这会留下一个通常没有用处的总和。相比之下,对于计算元素数量的样本属性(如平均值),似乎很自然地从计算中省略被屏蔽的元素:

>> ma.mean(-1)
MaskedNDArray([0.0, 2.5])

与以下内容不同 numpy.ma.MaskedArray#

Masked 不同于 MaskedArray 在许多方面。在用法上,一个主要的区别是大多数操作都作用于屏蔽值,即不会努力保存值。例如,比较::

>>> np_ma = np.ma.MaskedArray([1., 2., 3.], mask=[False, True, False])
>>> (np_ma + 1).data
array([2., 2., 4.])
>>> (Masked(np_ma) + 1).unmasked
array([2., 3., 4.])

做出这一决定的主要原因是,对于某些屏蔽子类,如MASTED Quantity ,保持原始值没有意义(例如,考虑将长度除以时间:如果掩码数量的单位正在更改,为什么它的值不应该更改?)但它也有助于保持实现相当简单,因为 Masked 类现在主要处理传播掩码,而不是决定如何处理值。

第二个不同之处是,对于约简,掩码的传播方式与对单个元素执行操作时的情况相同:

>>> np_ma.prod()
3.0
>>> np_ma[0] * np_ma[1] * np_ma[2]
masked
>>> Masked(np_ma).prod()
MaskedNDArray(——)

想一想像蒙面的子类这样的子类,这样做的理由再次变得清晰起来 Quantity 。例如,考虑一个数组 s 有形状的长度 (N, 3) ,其中最后一个轴表示宽度、高度和深度。这样,您就可以通过取最后一个轴上的值的乘积来计算相应的体积, s.prod(axis=-1) 。但是,如果跳过被屏蔽的元素,结果中条目的物理维度将取决于有多少元素被屏蔽,这是一件很重要的事情 Quantity 不能代表(而且会相当令人惊讶!)。然而,如上所述,对于对其定义良好的操作,例如用于获得平均值和诸如方差和标准差的其他样本属性,被屏蔽的元素被跳过。

第三个区别更多的是概念性的。为 MaskedArray 所创建的实例是未屏蔽实例的屏蔽版本,即, MaskedArray 记得它包装了一个子类,比如 Quantity ,但不共享其任何方法。因此,尽管产生的类乍看起来是合理的,但它并不像预期的那样工作:

>>> q = [1., 2.] * u.m
>>> np_mq = np.ma.MaskedArray(q, mask=[False, True])
>>> np_mq
masked_Quantity(data=[1.0, --],
                mask=[False,  True],
          fill_value=1e+20)
>>> np_mq.unit
Traceback (most recent call last):
...
AttributeError: 'MaskedArray' object has no attribute 'unit'...
>>> np_mq / u.s
<Quantity [1., 2.] 1 / s>

相比之下, Masked 始终正确地围绕着数据,即 MaskedQuantity 是一个具有屏蔽值的量,但其单位永远不会被屏蔽。事实上,人们可以从类层次结构中看到这一点::

>>> mq.__class__.__mro__
(<class 'astropy.utils.masked.core.MaskedQuantity'>,
 <class 'astropy.units.quantity.Quantity'>,
 <class 'astropy.utils.masked.core.MaskedNDArray'>,
 <class 'astropy.utils.masked.core.Masked'>,
 <class 'astropy.utils.shapes.NDArrayShapeMethods'>,
 <class 'numpy.ndarray'>,
 <class 'object'>)

这种选择使实现变得简单得多: Masked 只需考虑如何处理屏蔽值,而 Quantity 可以只担心单位传播等。事实上,一项实验表明,应用 MaskedColumn (它是的子类 ndarray ),结果是一个新的 MaskedColumn 这“就是工作”,不需要覆盖和特殊的Shell,这是需要的 MaskedArray 与.一起工作 Column 。(但是,因为行为确实发生了一些变化,所以我们选择不替换现有实现。)

在某些方面,而不是考虑 Masked 与类似于 MaskedArray ,它可能更有用的想法是 Masked 类似于用NaN(非数字)标记数组中的错误元素。与那些NAN一样,掩码只是传播,只是对于某些操作,如取 nanmean 使用的是。

参考/API#

Asterpy.utils.MASTED包#

内置口罩混合类。

该设计使用 Masked 作为工厂类,它自动为本身是预定义掩码类的子类的任何数据类生成新的子类, MaskedNDArray 为以下对象提供这样的预定义类 ndarray

Classes#

Masked(*args, **kwargs)

标量值或具有关联掩码的值数组。

MaskedNDArray(*args[, mask])

蒙面版的ndarray。

类继承关系图#

Inheritance diagram of astropy.utils.masked.core.Masked, astropy.utils.masked.core.MaskedNDArray

Asterpy.utils.masked.Function_Helpers模块#

用于让NumPy函数与掩码数组交互的帮助器。

该模块为相应地传播掩码的NumPy函数提供帮助器例程,以便在 __array_function__ 实施 MaskedNDArray 。它们本身并不是很有用,但带有文档字符串的文档包含在文档中,因此有一个地方可以了解掩码是如何解释的。

功能#

bincount(x[, weights, minlength])

统计非负整数数组中每个值的出现次数。

broadcast_arrays(*args[, subok])

将广播阵列转换为普通形状。

broadcast_to(array, shape[, subok])

将广播阵列调整为给定形状。

choose(a, choices[, out, mode])

从一个索引数组和一组可供选择的数组构造一个数组。

copyto(dst, src[, casting, where])

将值从一个数组复制到另一个数组,并根据需要进行广播。

count_nonzero(a[, axis, keepdims])

对数组中的非零值进行计数 a

empty_like(prototype[, dtype, order, subok, ...])

返回与给定数组具有相同形状和类型的新数组。

full_like(a, fill_value[, dtype, order, ...])

返回与给定数组具有相同形状和类型的完整数组。

insert(arr, obj, values[, axis])

沿给定轴在给定索引之前插入值。

interp(x, xp, fp, *args, **kwargs)

一维线性插补。

lexsort(keys[, axis])

使用键序列执行间接稳定排序。

nanargmax(a, *args, **kwargs)

喜欢 numpy.nanargmax ,也跳过屏蔽值。

nanargmin(a, *args, **kwargs)

喜欢 numpy.nanargmin ,也跳过屏蔽值。

nancumprod(a, *args, **kwargs)

喜欢 numpy.nancumprod ,也跳过屏蔽值。

nancumsum(a, *args, **kwargs)

喜欢 numpy.nancumsum ,也跳过屏蔽值。

nanmax(a, *args, **kwargs)

喜欢 numpy.nanmax ,也跳过屏蔽值。

nanmean(a, *args, **kwargs)

喜欢 numpy.nanmean ,也跳过屏蔽值。

nanmedian(a, *args, **kwargs)

喜欢 numpy.nanmedian ,也跳过屏蔽值。

nanmin(a, *args, **kwargs)

喜欢 numpy.nanmin ,也跳过屏蔽值。

nanpercentile(a, *args, **kwargs)

喜欢 numpy.nanpercentile ,也跳过屏蔽值。

nanprod(a, *args, **kwargs)

喜欢 numpy.nanprod ,也跳过屏蔽值。

nanquantile(a, *args, **kwargs)

喜欢 numpy.nanquantile ,也跳过屏蔽值。

nanstd(a, *args, **kwargs)

喜欢 numpy.nanstd ,也跳过屏蔽值。

nansum(a, *args, **kwargs)

喜欢 numpy.nansum ,也跳过屏蔽值。

nanvar(a, *args, **kwargs)

喜欢 numpy.nanvar ,也跳过屏蔽值。

ones_like(a[, dtype, order, subok, shape])

返回一个与给定数组具有相同形状和类型的数组。

piecewise(x, condlist, funclist, *args, **kw)

计算分段定义的函数。

place(arr, mask, vals)

根据条件值和输入值更改数组的元素。

put(a, ind, v[, mode])

用给定值替换数组的指定元素。

putmask(a, mask, values)

根据条件值和输入值更改数组的元素。

select(condlist, choicelist[, default])

根据条件返回从选项列表中的元素提取的数组。

zeros_like(a[, dtype, order, subok, shape])

返回与给定数组具有相同形状和类型的零数组。