使用 astropy 有效地获取 Python 中的图像中点
Efficiently get midpoint of image in Python with astropy
我的数据以 table 格式组织(example.fits)。我使用 Python 模块 atpy
打开这个 table ('mappars')。 table 有 x,y 列,它们是图像坐标和数据列 z。
x,y 均匀分布(CCD 检测器上的事件),但它们之间有间隙。
我像这样获取图像中间的值:
import atpy
import numpy as np
mappars = atpy.Table('example.fits')
#get midpoint value
midx = np.int((np.max(mappars['x'])+np.min(mappars['x']))/2)
midy = np.int((np.max(mappars['y'])+np.min(mappars['y']))/2)
midist = mappars.where((mappars.x == midx) & (mappars.y == midy)['z']
是否有更有效的方法(不包含 atpy
的 .where 函数)?
还有一个函数对应于 astropy
.table 中的 .where 因为我想从 atpy
移动到 astropy
?
您应该能够使用 astropy.io
和 numpy
非常相似地执行此操作。我没有方便的事件文件,但类似:
从 astropy.io 导入适合
将 numpy 导入为 np
with fits.open("example.fits") as hdulist:
events = hdulist[1].data # since hdu 0 should be an ImageHDU type, the events are probably in the first extension
midx = np.int((np.max(events['x'])+np.min(events['x']))/2)
midy = np.int((np.max(events['y'])+np.min(events['y']))/2)
midist = events['z'][(events['x'] == midx) & (events['y'] == midy)]
在这种情况下,我直接使用布尔 (numpy) 表达式 events['x'] == midx) & (events['y'] == midy)
.
创建一个布尔索引数组 events['z']
请注意,这是未经测试的;如果上面的方法对你来说失败了,我可能会尝试从互联网上的某个地方提取一个事件文件来测试它,当然除非你的事件文件是特殊的。
顺便说一下,如果 x
和 y
是 整数 像素坐标,您可以使用纯整数除法使事情稍微简单一些并跳过转换为 int:
midx = (np.max(events['x'])+np.min(events['x']))//2
midy = (np.max(events['y'])+np.min(events['y']))//2
这直接适用于 Python 3,如果你有 from __future__ import division
,则适用于 Python 2(无论如何你都应该这样做)。
我的数据以 table 格式组织(example.fits)。我使用 Python 模块 atpy
打开这个 table ('mappars')。 table 有 x,y 列,它们是图像坐标和数据列 z。
x,y 均匀分布(CCD 检测器上的事件),但它们之间有间隙。
我像这样获取图像中间的值:
import atpy
import numpy as np
mappars = atpy.Table('example.fits')
#get midpoint value
midx = np.int((np.max(mappars['x'])+np.min(mappars['x']))/2)
midy = np.int((np.max(mappars['y'])+np.min(mappars['y']))/2)
midist = mappars.where((mappars.x == midx) & (mappars.y == midy)['z']
是否有更有效的方法(不包含 atpy
的 .where 函数)?
还有一个函数对应于 astropy
.table 中的 .where 因为我想从 atpy
移动到 astropy
?
您应该能够使用 astropy.io
和 numpy
非常相似地执行此操作。我没有方便的事件文件,但类似:
从 astropy.io 导入适合 将 numpy 导入为 np
with fits.open("example.fits") as hdulist:
events = hdulist[1].data # since hdu 0 should be an ImageHDU type, the events are probably in the first extension
midx = np.int((np.max(events['x'])+np.min(events['x']))/2)
midy = np.int((np.max(events['y'])+np.min(events['y']))/2)
midist = events['z'][(events['x'] == midx) & (events['y'] == midy)]
在这种情况下,我直接使用布尔 (numpy) 表达式 events['x'] == midx) & (events['y'] == midy)
.
events['z']
请注意,这是未经测试的;如果上面的方法对你来说失败了,我可能会尝试从互联网上的某个地方提取一个事件文件来测试它,当然除非你的事件文件是特殊的。
顺便说一下,如果 x
和 y
是 整数 像素坐标,您可以使用纯整数除法使事情稍微简单一些并跳过转换为 int:
midx = (np.max(events['x'])+np.min(events['x']))//2
midy = (np.max(events['y'])+np.min(events['y']))//2
这直接适用于 Python 3,如果你有 from __future__ import division
,则适用于 Python 2(无论如何你都应该这样做)。