我正在使用环球网使我的脚本仅从某些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值。在
一个猜测,但是
a
是一个字符串不是一个整数吗?在这里发生了很多事情,你发布的代码甚至都是无效的(有缩进错误)。我认为这里没有一个关于堆栈溢出的有用的问题,因为你在没有意识到的情况下滥用了很多东西。也就是说,我希望能有所帮助,所以我发布了一个答案,而不仅仅是一个评论,因为我在答案中的代码格式更好。在
首先,我不知道你想要什么:
因为在这之前
^{pr2}$所以您可以检查,
str(x)
只是一个常量字符串'[]'
。所以你是说你想要一个通配符模式,看起来像'*_v0[].fits'
,我怀疑这是你想要的,但是即使是这样,你也应该显式地写,不使用str(x)
间接寻址。在然后,在
glob.glob
结果的循环中,您将执行以下操作:name
应该已经是一个字符串,所以不需要str(name)
。我不知道你为什么要在'FilePath'
前面加上前缀,因为glob.glob
返回的文件名与通配符模式匹配。那你为什么要在文件名前面加上什么?在接下来,测试}。比较的结果已经是布尔值,所以不需要进行额外的比较。在
(192 <= a <= 206)
两次。您只需检查一次,不要使用is True
和{最后,在这里使用Numpy数组没有太大的优势,除非你在数千个FITS文件上循环。但是使用
np.append
来增长数组是非常缓慢的,因为在每个循环中都会生成一个数组的新副本。在大多数情况下,您可以使用Python列表,然后根据需要将列表转换为Numpy数组。如果首先使用Numpy数组,那么可以使用np.zeros()
预先分配一个一定大小的空数组。你可以先猜一个尺寸开始,然后在需要的时候再增加。因为你在一个文件列表上循环,你可以使用你循环的文件数量。在下面是我想用更惯用的Python所做的改写:
你也可以考虑更清楚的变量名,等等。我相信这不是你想要的,但也许这会给你一个更好的结构来使用。在
首先,抛弃
np.append
。改用list appendnp.arange(0)
确实创建了一个0元素数组。但不能fill it
。它充其量是用来快速启动np.append
步骤,这将创建一个具有新值的新数组。arr=np.empty((n,), float)
生成一个可以用arr[i]=new_value
语句填充的n
元素数组。在这将更快,并应提供有关添加内容的更好信息。如果
x
和y1
仍然是[]
,那么是的,您的筛选将跳过这部分代码。我还将抛出一些print
语句来确定。例如,将pass
替换为打印,这样您就可以看到哪些案例被拒绝了。在如果没有您的
pf
文件,或者不管它是什么,我们无法重现您的问题。我们只能建议一些方法来了解更多的情况。在相关问题 更多 >
编程相关推荐