微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在python的特定列表中正确放置结果的问题

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

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,True,0)
        isolist_temp.append(iso_)
        isolist_fin = IsophoteList(isolist_temp)
    return isolist_fin

isolist_sampled = list(map(isophote_sampling,test_set))

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

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,能够选择某个结果,并在其中选择前三列(对应于 'sma'-半长轴,'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 值,我们现在在最终列表的同一条目中都有两个拟合结果,对最终列表中的所有项目重复自身。

注意:

  • map() 命令用于将结果排序到最终列表“isolist_sampled”中,然后在下一个循环中将其转换为可访问的表。
  • 这只是完整笔记本的一小部分。所以,是的,我加载了解决此问题所需的所有包。
  • 我绝不是 Python 专家,所以请保持温和;)

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

编辑: 绘制后一个 '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,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,nclip=3)
        sample.update()
        iso_ = Isophote(sample,0)
        isolist_temp.append(iso_)
    isolist_fin = IsophoteList(isolist_temp)
return isolist_fin

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。