在astropy表列内插值数组

2024-06-08 23:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个辐射源的多波段目录(从SourceExtractor,如果你想知道的话),我把它读到了一个astropy表格中,格式如下:

Source # | FLUX_APER_BAND1 | FLUXERR_APER_BAND1  ...  FLUX_APER_BANDN | FLUXERR_APER_BANDN
1           np.array(...)      np.array(...)     ...   np.array(...)      np.array(...)
...

FLUX_APER_BAND1FLUXERR_APER_BAND1等中的阵列都有14个元素,这些元素给出了给定波段内给定源的光子数,在距离源中心14个不同的距离内(光圈光度法)。我有一系列的光圈(2,3,4,6,8,10,14,20,28,40,60,80,100和160像素),我想将14个样本插值到其他一些光圈的单个(假设)计数中a。在

I可以迭代源代码,但目录中有3000多个源代码,这不是非常python或非常有效(在8个波段内插入3000个对象需要一段时间)。有没有一种方法可以同时将同一列中的所有阵列插值到同一个孔径上?我试着简单地应用np.interp,但是这抛出了ValueError: object too deep for desired array,以及{},但是那抛出了{}。似乎也可以对单个列的内容进行聚合,但我无法理解文档。在

有人能解释一下吗?提前谢谢!在


Tags: 目录元素距离源代码波段nparray插值
2条回答

我不熟悉astropy表的格式,但它看起来可以表示为一个三维的numpy阵列,轴代表源、波段和光圈。如果是这样,您可以使用,例如,^{}。下面是一个简单的例子。在

In [51]: from scipy.interpolate import interp1d

制作一些样本数据。“表”y是三维的,形状为(2,3,14)。把它想象成一个包含2个源,3个波段和14个孔径的计数的阵列。在

^{pr2}$

创建插值器。这将在默认情况下创建线性插值器。(查看不同插值器的docstring。另外,在调用interp1d之前,您可能希望以适当的线性插值方式转换数据。)我使用axis=2来创建光圈轴的插值器。^{aperture}(返回一个值为cd5的数组)。在

In [55]: f = interp1d(x, y, axis=2)

看两个y片。这些对应于孔径2和3(即x[0]和{})。在

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.]])

关于Pythonic,它的关键方面是简单性、可读性和实用性。如果你的例子真的是一次性的(也就是说,你要做几次3000×8的插值,而不是100万次),那么最快、最容易理解的解决方案就是简单地用Python循环迭代。我所说的最快,是指从你知道你的问题,直到你从你的代码得到答案。在

循环和调用一个函数24000次的开销在人类/天文学家的时间尺度上是相当小的,而且绝对比编写堆栈溢出帖子要低得多。:-)

相关问题 更多 >