内插一个天体表列中的数组
作者:互联网
我有一个辐射源的多波段目录(如果您想知道的话,可以从SourceExtractor中获得),该目录以以下形式读入了一个星状表:
Source # | FLUX_APER_BAND1 | FLUXERR_APER_BAND1 ... FLUX_APER_BANDN | FLUXERR_APER_BANDN
1 np.array(...) np.array(...) ... np.array(...) np.array(...)
...
FLUX_APER_BAND1,FLUXERR_APER_BAND1等中的阵列每个都有14个元素,这些元素给出给定波段中给定光源的光子计数数量,距光源中心14个不同距离(孔径光度法).我有孔径阵列(2、3、4、6、8、10、14、20、28、40、60、80、100和160像素),并且我想将14个样本插值到一个像素中(假定)在其他孔a处计数.
我可以遍历源代码,但是目录中有3000多个源代码,而且不是很Python或非常有效(在8个波段内插3000个对象需要一段时间).有没有一种方法可以将同一列中的所有数组同时插值到相同的孔径?我尝试简单地应用np.interp,但是它抛出了ValueError:对象对于所需数组太深,以及np.vectorize(np.interp),但是抛出了ValueError:对象对于所需数组而言深度太小.似乎也可以对单个列的内容进行聚合,但是我对文档没有任何意义.
有人可以阐明这一点吗?提前致谢!
解决方法:
我对天体表的格式不熟悉,但是看起来它可以表示为三维numpy数组,其轴用于光源,波段和光圈.在这种情况下,您可以使用例如scipy.interpolate.interp1d
.这是一个简单的示例.
In [51]: from scipy.interpolate import interp1d
制作一些样本数据. “桌子” y是3-D,形状为(2、3、14).可以将其视为保存2个源,3个波段和14个光圈的计数的阵列.
In [52]: x = np.array([2, 3, 4, 6, 8, 10, 14, 20, 28, 40, 60, 80, 100, 160])
In [53]: y = np.array([[x, 2*x, 3*x], [x**2, (x+1)**3/400, (x**1.5).astype(int)]])
In [54]: y
Out[54]:
array([[[ 2, 3, 4, 6, 8, 10, 14, 20, 28,
40, 60, 80, 100, 160],
[ 4, 6, 8, 12, 16, 20, 28, 40, 56,
80, 120, 160, 200, 320],
[ 6, 9, 12, 18, 24, 30, 42, 60, 84,
120, 180, 240, 300, 480]],
[[ 4, 9, 16, 36, 64, 100, 196, 400, 784,
1600, 3600, 6400, 10000, 25600],
[ 0, 0, 0, 0, 1, 3, 8, 23, 60,
172, 567, 1328, 2575, 10433],
[ 2, 5, 8, 14, 22, 31, 52, 89, 148,
252, 464, 715, 1000, 2023]]])
创建插值器.默认情况下,这将创建一个线性插值器. (检查不同的插值器的文档字符串.此外,在调用interp1d之前,您可能希望以适合线性插值的方式转换数据.)我使用axis = 2创建光圈轴的插值器. f将是一个获取光圈值并返回形状为(2,3)的数组的函数.
In [55]: f = interp1d(x, y, axis=2)
看一下y片.这些对应于孔2和3(即x [0]和x [1]).
In [56]: y[:,:,0]
Out[56]:
array([[2, 4, 6],
[4, 0, 2]])
In [57]: y[:,:,1]
Out[57]:
array([[3, 6, 9],
[9, 0, 5]])
使用插值器获得孔径2、2.5和3处的值.如预期的那样,2和3处的值与y中的值匹配.
In [58]: f(2)
Out[58]:
array([[ 2., 4., 6.],
[ 4., 0., 2.]])
In [59]: f(2.5)
Out[59]:
array([[ 2.5, 5. , 7.5],
[ 6.5, 0. , 3.5]])
In [60]: f(3)
Out[60]:
array([[ 3., 6., 9.],
[ 9., 0., 5.]])
标签:astropy,python,numpy,interpolation 来源: https://codeday.me/bug/20191121/2052333.html