在 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 和 numpy 为 np)。为此 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 中,有一个质量我称之为 a。 a是每个文件都有的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
语句填充。
这会更快,并且应该提供有关正在添加的内容的更好信息。如果 x
和 y1
仍然是 []
,那么是的,您的过滤将跳过这部分代码。为了确定,我还会加入一些 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 True
和 is 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)
您还可以考虑更清晰的变量名等。我敢肯定这不是您想要做的,但也许这会帮助您获得更好的结构。
我正在使用 glob.glob 让我的脚本只从某些 FITS 文件中读取数据(astropy.io.fits 被引入为 pf 和 numpy 为 np)。为此 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 中,有一个质量我称之为 a。 a是每个文件都有的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
语句填充。
这会更快,并且应该提供有关正在添加的内容的更好信息。如果 x
和 y1
仍然是 []
,那么是的,您的过滤将跳过这部分代码。为了确定,我还会加入一些 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 True
和 is 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)
您还可以考虑更清晰的变量名等。我敢肯定这不是您想要做的,但也许这会帮助您获得更好的结构。