屏蔽值 (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
可以只担心单位传播等。事实上,一项实验表明,应用 Masked
至 Column
(它是的子类 ndarray
),结果是一个新的 MaskedColumn
这“就是工作”,不需要覆盖和特殊的Shell,这是需要的 MaskedArray
与.一起工作 Column
。(但是,因为行为确实发生了一些变化,所以我们选择不替换现有实现。)
在某些方面,而不是考虑 Masked
与类似于 MaskedArray
,它可能更有用的想法是 Masked
类似于用NaN(非数字)标记数组中的错误元素。与那些NAN一样,掩码只是传播,只是对于某些操作,如取 nanmean
使用的是。
参考/API#
Asterpy.utils.MASTED包#
内置口罩混合类。
该设计使用 Masked
作为工厂类,它自动为本身是预定义掩码类的子类的任何数据类生成新的子类, MaskedNDArray
为以下对象提供这样的预定义类 ndarray
。
Classes#
|
标量值或具有关联掩码的值数组。 |
|
蒙面版的ndarray。 |
类继承关系图#
Asterpy.utils.masked.Function_Helpers模块#
用于让NumPy函数与掩码数组交互的帮助器。
该模块为相应地传播掩码的NumPy函数提供帮助器例程,以便在 __array_function__
实施 MaskedNDArray
。它们本身并不是很有用,但带有文档字符串的文档包含在文档中,因此有一个地方可以了解掩码是如何解释的。
功能#
|
统计非负整数数组中每个值的出现次数。 |
|
将广播阵列转换为普通形状。 |
|
将广播阵列调整为给定形状。 |
|
从一个索引数组和一组可供选择的数组构造一个数组。 |
|
将值从一个数组复制到另一个数组,并根据需要进行广播。 |
|
对数组中的非零值进行计数 |
|
返回与给定数组具有相同形状和类型的新数组。 |
|
返回与给定数组具有相同形状和类型的完整数组。 |
|
沿给定轴在给定索引之前插入值。 |
|
一维线性插补。 |
|
使用键序列执行间接稳定排序。 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
喜欢 |
|
返回一个与给定数组具有相同形状和类型的数组。 |
|
计算分段定义的函数。 |
|
根据条件值和输入值更改数组的元素。 |
|
用给定值替换数组的指定元素。 |
|
根据条件值和输入值更改数组的元素。 |
|
根据条件返回从选项列表中的元素提取的数组。 |
|
返回与给定数组具有相同形状和类型的零数组。 |