您好我写了以下python代码(据说)从FITS文件中提取数据。
target_array=np.loadtxt(target_list)
N=len(target_array)
target=['target_{0}.fits'.format(i) for i in range(1,N+1,1)]
hdu=[]
hdudata=[]
for i in range(N):
hdu.append(pyfits.open(target[i]))
hdudata.append(hdu[i][1].data)
f=[]
for i in range(N):
for j in range(len(hdudata[i])):
if dist(target_array[i][0],hdudata[i][j]['Ra'],target_array[i][1],hdudata[i][j]['Dec']) <= func(hdudata[i][j]['Energy']):
f.append(hdudata[i][j]['Energy'])
print "Target", i, "successfully stacked"
np.savetxt('energy_stack.txt',f)
target_array是一个N x 2数组,包含感兴趣目标的坐标。每个目标FITS文件包含数千个与特定坐标和能量相关联的“事件”。代码循环遍历每个目标中的每个事件,并为符合条件的事件(目标坐标与事件坐标之间的距离必须小于某个指定数字)之间的能量获取能量,如果它符合保存的条件“ f“这是一维数组,一个简单的数字列表(约23000个数字)。
在savetxt命令之前一切正常,然后它会发出错误:
Traceback (most recent call last):
File "pipe_stack.py", line 184, in <module>
get_target_energy('target_list_reduced.txt')
File "pipe_stack.py", line 132, in get_target_energy
np.savetxt('energy_stack.txt',f)
File "/home/heatdeath/fermi_science/ScienceTools-v10r0p5-fssc-20150518A-source/external/x86_64-unknown-linux-gnu-libc2.19-0/lib/python2.7/site-packages/numpy/lib/npyio.py", line 1118, in savetxt
ncol = X.shape[1]
IndexError: tuple index out of range
我需要知道出了什么问题。此代码适用于不同的样本。
答案 0 :(得分:0)
您savetxt
(称为f
)的第一件事X
是
X = np.asarray(X)
这使它成为一个数组。 savetxt
旨在为数字编写一个二维数组,一次一行写入文件。
在您创建时,f=[]
,然后是f.append...
。所以它是一些东西 - 列表,数组?
您需要查看f
并找出如何将其转换为有效的numpy数组。
答案 1 :(得分:0)
我解决了这个问题。我没有附加一个空数组,而是制作了一个非常大的二维数组:
f=np.zeros((N,1e6))
for i in range(N):
for j in range(len(hdudata[i])):
if dist(target_array[i][0],hdudata[i][j]['Ra'],target_array[i][1],hdudata[i][j]['Dec']) <= func(hdudata[i][j]['Energy']):
f[i][j]=hdudata[i][j]['Energy']
print "Target", i, "successfully stacked"
我希望通过初始化数组来节省时间,因为计算机每次附加数组时都不必来回分配内存。 (从理论上讲,它的工作速度更快,但根据我的经验,它似乎相同)。无论如何,我然后使用一些numpy技巧将2D数组展平为一维数组,然后使用以下代码删除额外的零:
f=np.ndarray.flatten(f)
f=f[f!=0]
np.savetxt('energy_stack.txt',f)
然后savetxt工作了。我不知道为什么它不能使用前面的方法,因为我正在保存一个充满浮动的一维数组,这正是我在这里做的我只是为了节省时间(据说)而重做它。无论如何。谢谢大家的帮助。