将结果正确放置在 python 中的特定列表中时出现问题

Problem with correctly placing results in specific list in python

我目前正在尝试通过 isophote 拟合函数 运行 m87 的一组图像(屏蔽数组/屏蔽 'fits' 文件)。因此,在脚本的前面已经执行了一个参考拟合,它提供了具有等光度几何的函数,然后用于对星系的剩余图像进行采样。该函数如下所示:

from photutils.isophote import EllipseSample, Isophote, IsophoteList
from photutils.isophote.isophote import Isophote, IsophoteList

test_set = [images_masked[0], images_masked[1]]
isolist_temp = []

def isophote_sampling(data_set):
    for iso in uvw2_isolist_nclp3[1:]:
        for data in test_set:
            g = iso.sample.geometry
            sample = EllipseSample(data, g.sma, geometry=g, sclip=3.0, nclip=3)
            sample.update()
            iso_ = Isophote(sample, 0, True, 0)
        isolist_temp.append(iso_)
        isolist_fin = IsophoteList(isolist_temp)
    return isolist_fin

isolist_sampled = list(map(isophote_sampling,test_set))

要详细访问结果,必须转换为可索引 table:

isolist_results =[]
for isolist in isolist_sampled:
    isolist_tab = isolist.to_table()
    isolist_results.append(isolist_tab)

这个想法是,这段代码的最终产品是一个包含列表的列表,这些列表是正在执行拟合的相应图像的结果。所以基本上是这样的:

isolist_results = [[results from image0], [results from image1], ...]

我希望能够访问 isolist_results,能够 select 某个结果,其中前三列(对应于 'sma'-semi-长轴,'intens'-等光强度,'intens_err'-对应误差)。这将允许我简单地为函数提供我的全套图像,并在拟合访问后绘制和计算它们之间的不同比较。 当前结果如下所示:

[<QTable length=138>
       sma                 intens         ... niter stop_code
                                          ...                
     float64              float64         ... int64   int64  
------------------ ---------------------- ... ----- ---------
0.5478081360044621    0.13135528023713275 ...     0         0
0.6025889496049083     0.1299246647753987 ...     0         0
0.6628478445653991    0.12836718613254233 ...     0         0
0.7291326290219391    0.12667273127860207 ...     0         0
 0.802045891924133    0.12483448451703007 ...     0         0
0.8822504811165464    0.12284968122832181 ...     0         0
 0.970475529228201    0.12069334888176463 ...     0         0
 1.067523082151021    0.11792209677230417 ...     0         0
1.1742753903661232    0.11416709361894391 ...     0         0
               ...                    ... ...   ...       ...
       sma                 intens         ... niter stop_code
                                          ...                
     float64              float64         ... int64   int64  
------------------ ---------------------- ... ----- ---------
0.5478081360044621    0.13135528023713275 ...     0         0
0.6025889496049083     0.1299246647753987 ...     0         0
0.6628478445653991    0.12836718613254233 ...     0         0
0.7291326290219391    0.12667273127860207 ...     0         0
 0.802045891924133    0.12483448451703007 ...     0         0
0.8822504811165464    0.12284968122832181 ...     0         0
 0.970475529228201    0.12069334888176463 ...     0         0
 1.067523082151021    0.11792209677230417 ...     0         0
1.1742753903661232    0.11416709361894391 ...     0         0
               ...                    ... ...   ...       ...

如您所见,问题在于函数仅将输入的所有迭代的结果之一放入其中。将 'isolist_temp.append(iso_)' 命令向右移动一个缩进,导致:

[<QTable length=276>
       sma                 intens         ... niter stop_code
                                          ...                
     float64              float64         ... int64   int64  
------------------ ---------------------- ... ----- ---------
0.5478081360044621    0.21974529309537935 ...     0         0
0.5478081360044621    0.13135528023713275 ...     0         0
0.6025889496049083    0.21833267680395468 ...     0         0
0.6025889496049083     0.1299246647753987 ...     0         0
0.6628478445653991    0.21679269241579674 ...     0         0
0.6628478445653991    0.12836718613254233 ...     0         0
0.7291326290219391    0.21511467290298006 ...     0         0
0.7291326290219391    0.12667273127860207 ...     0         0
 0.802045891924133    0.21329102749191028 ...     0         0
               ...                    ... ...   ...       ...
       sma                 intens         ... niter stop_code
                                          ...                
     float64              float64         ... int64   int64  
------------------ ---------------------- ... ----- ---------
0.5478081360044621    0.21974529309537935 ...     0         0
0.5478081360044621    0.13135528023713275 ...     0         0
0.6025889496049083    0.21833267680395468 ...     0         0
0.6025889496049083     0.1299246647753987 ...     0         0
0.6628478445653991    0.21679269241579674 ...     0         0
0.6628478445653991    0.12836718613254233 ...     0         0
0.7291326290219391    0.21511467290298006 ...     0         0
0.7291326290219391    0.12667273127860207 ...     0         0
 0.802045891924133    0.21329102749191028 ...     0         0
               ...                    ... ...   ...       ...

如您所见,现在两个结果都被放入最终列表,但是对于每个 sma 值,我们现在在最终列表的同一条目中都有两个拟合结果,对最终列表中的所有项目重复自身.

注:

问题: 为了获得如上所述的最终列表(每个条目对应于相应输入图像的完整 array/list 结果),我需要在函数中或之后更改什么? 我假设这是一个微不足道的更正,但我似乎无法找到它。感谢您在这方面给我的任何帮助。

编辑: 绘制后者 'isolist_results' 看起来像 this。 所以换句话说,现在 'isolist_results' 中的两个条目都包含两个结果,但我希望条目 1 包含图像 1 的结果,而条目 2 包含另一个。我希望这能解决我的问题!

我觉得下面的内容不对 - 你不应该在 for 循环中将“iso_”附加到 isolist_temp 吗?

for data in test_set:
    g = iso.sample.geometry
    sample = EllipseSample(data, g.sma, geometry=g, sclip=3.0, nclip=3)
    sample.update()
    iso_ = Isophote(sample, 0, True, 0)
isolist_temp.append(iso_)
isolist_fin = IsophoteList(isolist_temp)

我还担心您在进入 for 数据循环之前没有重置 isolist_temp - 不知道您在做什么它闻起来不对。

下面更倾向于通常对循环更有意义的解的形状。

for iso in uvw2_isolist_nclp3[1:]:
    isolist_temp = []
    for data in test_set:
        g = iso.sample.geometry
        sample = EllipseSample(data, g.sma, geometry=g, sclip=3.0, nclip=3)
        sample.update()
        iso_ = Isophote(sample, 0, True, 0)
        isolist_temp.append(iso_)
    isolist_fin = IsophoteList(isolist_temp)
return isolist_fin