在 FITS 文件上使用 glob.glob 之后的 'if statement' 时数组返回为空

Arrays returning as empty when using an 'if statement' after glob.glob on FITS Files

我正在使用 glob.glob 让我的脚本只从某些 FITS 文件中读取数据(astropy.io.fits 被引入为 pf numpynp)。为此 x 是我为获取这些特定文件而更改的值(供参考 'x = np.arrange(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 文件的 header 中,有一个质量我称之为 aa是每个文件都有的non-integer数值。我只想读取特定范围内 a 的文件。然后我从 FITS 文件中获取我需要的数据并将其添加到一个数组中(因为这是 'power' p1 被添加到 y1 和 'time' t 被添加到 x).

            imh = pf.getheader(imn)
            a = imh['a']

            if (192 <= a <= 206) is False:
                pass

            if (192 <= a <= 206) is True:
                im = pf.getdata(imn, origin='lower')
                subim1 = im[340:390, 75:120]
                p1 = np.mean(subim1)

                t = SubfucntionToGetTime

                y1 = np.append(y1, p1)
                x = np.append(x, t)

然而,当我 运行 这个函数时,它 returns 使用没有值的数组。我相信这与我的代码在遇到没有适当 a 值的文件时无法正常工作有关,但我不知道如何解决这个问题。

作为额外参考,我已经针对我知道具有正确 a 值的较小的 FITS 文件子组对此进行了测试,并且它工作正常,这就是我怀疑它正在经历的原因a 值 messes-up 作为前几个文件的代码没有正确的 a 值。

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

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

首先,放弃 np.append。改为使用列表追加

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

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

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

没有您的 pf 文件,或者它是什么,我们无法重现您的问题。我们只能建议更多了解正在发生的事情的方法。

这里发生了很多事情,您发布的代码甚至无效(有缩进错误)。我认为这里没有针对 Stack Overflow 的有用问题,因为您在没有意识到的情况下滥用了很多东西。也就是说,我想提供帮助,所以我发布了一个答案,而不仅仅是评论,因为我在答案中更好地格式化了代码。

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

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

因为在此之前你有

x = np.arange(0)

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

然后在你的 glob.glob 结果循环中你做:

imn = 'FilePath' + str(name)

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

接下来测试 (192 <= a <= 206) 两次。您只需要检查一次,不要使用 is Trueis False。比较的结果已经是一个布尔值,所以你不需要再做这个额外的比较。

最后,除非您要遍历数千个 FITS 文件,否则在这里使用 Numpy 数组并没有多大优势。但是使用 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)

您还可以考虑更清晰的变量名等。我敢肯定这不是您想要做的,但也许这会帮助您获得更好的结构。