切片和索引NDData#

介绍#

本页只讨论适用于 NDData-like classes. For a tutorial about slicing/indexing see the python documentationnumpy documentation .

警告

NDDataNDDataRef 对属性几乎没有任何限制,因此可能会发生某些 有效但不寻常 属性的组合总是会导致索引错误或不正确的结果。在这种情况下,请参见 子类别化 关于如何为特定属性自定义切片。

切片NDDataRef#

不像 NDData 班级 NDDataRef 实现切片或索引。结果将与切片对象包装在同一个类中。

获取一个元素:

>>> import numpy as np
>>> from astropy.nddata import NDDataRef

>>> data = np.array([1, 2, 3, 4])
>>> ndd = NDDataRef(data)
>>> ndd[1]
NDDataRef(2)

获取原始文件的切片部分:

>>> ndd[1:3]  # Get element 1 (inclusive) to 3 (exclusive)
NDDataRef([2, 3])

这将返回一个引用 不是副本 )因此更改切片会影响原始属性:

>>> ndd_sliced = ndd[1:3]
>>> ndd_sliced.data[0] = 5
>>> ndd_sliced
NDDataRef([5, 3])
>>> ndd
NDDataRef([1, 5, 3, 4])

但只有一个被索引的元素会受到影响(例如, ndd_sliced = ndd[1] ). 元素是标量,更改不会传播到原始元素。

切片NDDataRef,包括属性#

如果 maskuncertainty 如果存在,则此属性也将被切片::

>>> from astropy.nddata import StdDevUncertainty
>>> data = np.array([1, 2, 3, 4])
>>> mask = data > 2
>>> uncertainty = StdDevUncertainty(np.sqrt(data))
>>> ndd = NDDataRef(data, mask=mask, uncertainty=uncertainty)
>>> ndd_sliced = ndd[1:3]

>>> ndd_sliced.data
array([2, 3])

>>> ndd_sliced.mask
array([False,  True]...)

>>> ndd_sliced.uncertainty  
StdDevUncertainty([1.41421356, 1.73205081])

unitmeta 但不会受到影响。

如果设置了任何属性但未实现切片,则会打印一条信息,并且该属性将保持原样:

>>> data = np.array([1, 2, 3, 4])
>>> mask = False
>>> uncertainty = StdDevUncertainty(0)
>>> ndd = NDDataRef(data, mask=mask, uncertainty=uncertainty)
>>> ndd_sliced = ndd[1:3]
INFO: uncertainty cannot be sliced. [astropy.nddata.mixins.ndslicing]
INFO: mask cannot be sliced. [astropy.nddata.mixins.ndslicing]

>>> ndd_sliced.mask
False

基于世界坐标的NDData切片#

如果 wcs 设置,则必须是 BaseLowLevelWCSBaseHighLevelWCS . 这意味着只支持不带步骤的整数或范围切片。所以切片就像 [::10] 或者基于数组或基于布尔的切片将不起作用。

如果你想切 NDData 对象调用 ndd 如果没有WCS,则可以从 NDData 运行对象:

>>> ndd.wcs = None

删除屏蔽数据#

警告

如果 wcs 已经设定了这个遗嘱 NOT 有可能。但是可以通过将wcs属性设置为 None 具有 ndd.wcs = None 切片前。

按照惯例 mask 属性指示点是有效还是无效。因此,我们可以通过对掩模进行切片来获得所有有效的数据点。

实例#

要通过使用遮罩进行切片来获取所有有效数据点,请执行以下操作:

>>> data = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> mask = np.array([[0,1,0],[1,1,1],[0,0,1]], dtype=bool)
>>> uncertainty = StdDevUncertainty(np.sqrt(data))
>>> ndd = NDDataRef(data, mask=mask, uncertainty=uncertainty)
>>> # don't forget that ~ or you'll get the invalid points
>>> ndd_sliced = ndd[~ndd.mask]
>>> ndd_sliced
NDDataRef([1, 3, 7, 8])

>>> ndd_sliced.mask
array([False, False, False, False]...)

>>> ndd_sliced.uncertainty  
StdDevUncertainty([1.        , 1.73205081, 2.64575131, 2.82842712])

或所有无效点:

>>> ndd_sliced = ndd[ndd.mask] # without the ~ now!
>>> ndd_sliced
NDDataRef([—, —, —, —, —])

>>> ndd_sliced.mask
array([ True,  True,  True,  True,  True]...)

>>> ndd_sliced.uncertainty  
StdDevUncertainty([1.41421356, 2.        , 2.23606798, 2.44948974, 3.        ])

备注

这种索引(布尔索引)的结果总是一维的!