切片和索引NDData#
介绍#
本页只讨论适用于 NDData
-like classes. For a tutorial about slicing/indexing see the python documentation 和 numpy documentation .
切片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,包括属性#
如果 mask
或 uncertainty
如果存在,则此属性也将被切片::
>>> 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])
unit
和 meta
但不会受到影响。
如果设置了任何属性但未实现切片,则会打印一条信息,并且该属性将保持原样:
>>> 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
设置,则必须是 BaseLowLevelWCS
或 BaseHighLevelWCS
. 这意味着只支持不带步骤的整数或范围切片。所以切片就像 [::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. ])
备注
这种索引(布尔索引)的结果总是一维的!