Python numpy savetxt不保存:“元组索引超出范围”

时间:2017-01-08 00:36:48

标签: python numpy

您好我写了以下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

我需要知道出了什么问题。此代码适用于不同的样本。

2 个答案:

答案 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工作了。我不知道为什么它不能使用前面的方法,因为我正在保存一个充满浮动的一维数组,这正是我在这里做的我只是为了节省时间(据说)而重做它。无论如何。谢谢大家的帮助。