将结果正确放置在 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 值,我们现在在最终列表的同一条目中都有两个拟合结果,对最终列表中的所有项目重复自身.
注:
- map() 命令用于将结果排序到最终列表 'isolist_sampled',然后在下一个循环中将其转换为可访问的 tables。
- 这只是完整笔记本的一小部分。所以是的,我加载了所有需要的包来解决这个问题。
- 我绝不是python专家,所以请温和;)
问题:
为了获得如上所述的最终列表(每个条目对应于相应输入图像的完整 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
我目前正在尝试通过 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 值,我们现在在最终列表的同一条目中都有两个拟合结果,对最终列表中的所有项目重复自身.
注:
- map() 命令用于将结果排序到最终列表 'isolist_sampled',然后在下一个循环中将其转换为可访问的 tables。
- 这只是完整笔记本的一小部分。所以是的,我加载了所有需要的包来解决这个问题。
- 我绝不是python专家,所以请温和;)
问题: 为了获得如上所述的最终列表(每个条目对应于相应输入图像的完整 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