其他分享
首页 > 其他分享> > 内插一个天体表列中的数组

内插一个天体表列中的数组

作者:互联网

我有一个辐射源的多波段目录(如果您想知道的话,可以从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