在之后使用“if语句”时返回为空的数组环球网on FITS文件

2024-03-29 09:20:28 发布

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

我正在使用环球网使我的脚本仅从某些FITS文件中读取数据(astropy.io.适合表示为pf,而numpy表示为np)。对于这个x是我为获得这些特定文件而更改的值(作为参考'x=np.安排(0)和y1=np.arange公司(0)简单地创建一个空数组,稍后我用数据填充它。在

def Graph(Pass):
    x = np.arange(0)
    y1 = np.arange(0)

    pathfile = '*_v0' + str(Pass) + '_stis_f25srf2_proj.fits'

        for name in glob.glob(pathfile):
             imn = 'FilePath' + str(name)

但是,我想为我使用的文件添加另一个过滤器。在每个FITS文件的头中都有一个质量,我将其称为a是每个文件都具有的非整数数值。我只想读取在特定范围内具有a的文件。然后我从FITS文件中获取所需的数据并将其添加到一个数组中(因为这是“power”p1被添加到y1,而'time't被添加到x)。在

^{pr2}$

但是,当我运行这个函数时,它返回的数组没有值。我相信这与我的代码在遇到一个没有适当的a值的文件时不能正常工作有关,但我不知道如何解决这个问题。在

为了进一步的参考,我测试了一个较小的FITS子组,我知道这些文件有正确的a值,而且它工作得很好,这就是为什么我怀疑它遇到的a值会使代码混乱,因为前几个文件没有正确的a值。在


Tags: 文件数据代码name脚本nppass数组
3条回答

一个猜测,但是a是一个字符串不是一个整数吗?在

>>> 192 <= "200" <= 206
False
>>> 192 <= int("200") <= 206
True

这里发生了很多事情,你发布的代码甚至都是无效的(有缩进错误)。我认为这里没有一个关于堆栈溢出的有用的问题,因为你在没有意识到的情况下滥用了很多东西。也就是说,我希望能有所帮助,所以我发布了一个答案,而不仅仅是一个评论,因为我在答案中的代码格式更好。在

首先,我不知道你想要什么:

pathfile = '*_v0' + str(x) + '.fits'

因为在这之前

^{pr2}$

所以您可以检查,str(x)只是一个常量字符串'[]'。所以你是说你想要一个通配符模式,看起来像'*_v0[].fits',我怀疑这是你想要的,但是即使是这样,你也应该显式地写,不使用str(x)间接寻址。在

然后,在glob.glob结果的循环中,您将执行以下操作:

imn = 'FilePath' + str(name)

name应该已经是一个字符串,所以不需要str(name)。我不知道你为什么要在'FilePath'前面加上前缀,因为glob.glob返回的文件名与通配符模式匹配。那你为什么要在文件名前面加上什么?在

接下来,测试(192 <= a <= 206)两次。您只需检查一次,不要使用is True和{}。比较的结果已经是布尔值,所以不需要进行额外的比较。在

最后,在这里使用Numpy数组没有太大的优势,除非你在数千个FITS文件上循环。但是使用np.append来增长数组是非常缓慢的,因为在每个循环中都会生成一个数组的新副本。在大多数情况下,您可以使用Python列表,然后根据需要将列表转换为Numpy数组。如果首先使用Numpy数组,那么可以使用np.zeros()预先分配一个一定大小的空数组。你可以先猜一个尺寸开始,然后在需要的时候再增加。因为你在一个文件列表上循环,你可以使用你循环的文件数量。在

下面是我想用更惯用的Python所做的改写:


def graph(n_pass):
    x = []
    y1 = []

    for filename in glob.glob('*_v0.fits'):
        header = pf.getheader(filename)
        a = header['a']
        if not (192 <= a <= 206):
            # We don't do any further processing for this file
            # for 'a' outside this range
            continue

        im = pf.getdata(filename, origin='lower')
        subim1 = im[340:390, 75:120]
        p1 = np.mean(subim1)
        t = get_time(...)
        y1.append(p1)
        x.append(t)

你也可以考虑更清楚的变量名,等等。我相信这不是你想要的,但也许这会给你一个更好的结构来使用。在

首先,抛弃np.append。改用list append

x = []
y1 = []
....
            y1.append(p1)
            x.append(t)

np.arange(0)确实创建了一个0元素数组。但不能fill it。它充其量是用来快速启动np.append步骤,这将创建一个具有新值的新数组。arr=np.empty((n,), float)生成一个可以用arr[i]=new_value语句填充的n元素数组。在

这将更快,并应提供有关添加内容的更好信息。如果xy1仍然是[],那么是的,您的筛选将跳过这部分代码。我还将抛出一些print语句来确定。例如,将pass替换为打印,这样您就可以看到哪些案例被拒绝了。在

如果没有您的pf文件,或者不管它是什么,我们无法重现您的问题。我们只能建议一些方法来了解更多的情况。在

相关问题 更多 >