Python astropy:table 和列对象
Python astropy: table and columns objects
我正在使用 astropy.table 模块中的 Tables 对象。
下面的一段代码显示了我正在处理的数据类型:
In [44]: table
Out[44]:
<Table length=9>
defocus source Chi2 xcentroid ycentroid FWHMx FWHMy Peak
float32 float32 float32 float32 float32 float32 float32 float32
------- ------- ------- --------- --------- ------- ------- -------
-0.3 0.0 346.648 2056.5 55.82 11.8635 11.8635 182.277
-0.3 4.0 148.302 2056.49 1911.02 6.66554 6.66554 299.074
-0.3 8.0 347.208 2056.51 3922.99 6.83129 6.83129 326.476
-0.26 0.0 318.489 2056.5 55.8803 10.206 10.206 195.055
-0.26 4.0 152.501 2056.51 1911.02 6.9012 6.9012 244.817
-0.26 8.0 285.845 2056.49 3922.99 7.7939 7.7939 236.194
-0.22 0.0 264.113 2056.5 55.9053 8.79704 8.79704 187.376
-0.22 4.0 163.228 2056.5 1911.02 2.43716 2.43716 402.182
-0.22 8.0 230.017 2056.5 3922.99 6.70312 6.70312 235.376
In [45]: type(table)
Out[45]: astropy.table.table.Table
In [46]: cols=table.columns
In [47]: type(cols)
Out[47]: astropy.table.table.TableColumns
In [48]: type(cols[0])
Out[48]: astropy.table.column.Column
In [50]: mylist_1 = [x for x in cols]
In [51]: mylist_2 = [cols[k] for k in range(len(cols))]
In [52]: type(mylist_1[0])
Out[52]: str
In [53]: type(mylist_2[0])
Out[53]: astropy.table.column.Column
In [54]: mylist_1[0]
Out[54]: 'defocus'
In [55]: mylist_2[0]
Out[55]:
<Column name='defocus' dtype='float32' length=9>
-0.3
-0.3
-0.3
-0.26
-0.26
-0.26
-0.22
-0.22
-0.22
我期待这两行:
mylist_1 = [x for x in cols]
和
mylist_2 = [cols[k] for k in range(len(cols))]
会得到完全相同的东西(第二个不太优雅),但事实并非如此,正如您在上面的输出中看到的那样(mylist_1 仅包含列名称,而不包含列他们自己)。为什么?关于我的 "cols" 对象,有什么我不太了解的地方吗?
感谢您的见解。
(我 运行 在尝试将我的 table 写入适合的文件时 - 使用 astropy.io.fits - 这需要构建一个适当的列列表,这不是很明显正如人们所期望的那样...)
astropy.table.table.TableColumns是astropy包的定义项。它是 class TableColumns 的一个实例,基本上您不应该使用迭代器 "cols[k]" 或 "in cols".
访问它
但是在 class 中你可以定义方法 contains() 和 getitem() 来描述行为这两个请求。参见 https://infohost.nmt.edu/tcc/help/pubs/python/web/special-methods.html
这里定义的行为似乎与class元素列表不相似。也许一些文档在 astropy classes 上可用。
您的循环在列上的迭代略有不同(但等效)。 但是 你在列表理解中附加了不同的东西。这些列类似于 dict
,因此它们具有索引和关联元素:
考虑这样的 table:
from astropy.table import Table
data_rows = [(1, 2.0, 'x'),
(4, 5.0, 'y'),
(5, 8.2, 'z')]
t = Table(rows=data_rows, names=('a', 'b', 'c'), meta={'name': 'first table'},
dtype=('i4', 'f8', 'S1'))
cols=t.columns
您使用以下方法遍历 列索引:
[x for x in cols]
# ['a', 'b', 'c']
或
[k for k in range(len(cols))]
# [0, 1, 2]
这些看起来不同,但 cols[0] == cols['a']
所以这些只是为您的列编制索引的两种不同方式。
但是如果你想迭代实际列而不是它们的索引,你可以这样做:
[cols[x] for x in cols]
# [<Column name='a' dtype='int32' length=3>1 4 5,
# <Column name='b' dtype='float64' length=3>2.0 5.0 8.2,
# <Column name='c' dtype='bytes1' length=3> x y z]
或:
[cols[k] for k in range(len(cols))]
# [<Column name='a' dtype='int32' length=3>1 4 5,
# <Column name='b' dtype='float64' length=3>2.0 5.0 8.2,
# <Column name='c' dtype='bytes1' length=3> x y z]
这次我们实际插入的是索引列,而不是插入索引。
然而,这并不能解决您转换为 FITS 的问题,但您始终可以将 Table 直接保存为他们的任何格式,请参阅 their supported formats。
例如,写入 fits 就像使用一样简单:
t.write('new_table.fits')
或
t.write('new_table.fits', format='fits')
astropy.table.table.TableColumns
对象(通过 columns
属性访问)是一个 有序字典 ,而不是列表。这就是 [x for x in cols]
给出列名列表的原因(与遍历普通字典相同,给出的是键,而不是值)。
为了方便起见,它还支持索引访问和切片,如 col[0]
或 cols[1:3]
。但即使它支持类似列表的访问,TableColumns
首先也是最重要的一个字典。
在 PR #4394 中将添加一个新的 itercols()
方法,它将支持 cols_list = [x for x in t.itercols()]
。
我正在使用 astropy.table 模块中的 Tables 对象。
下面的一段代码显示了我正在处理的数据类型:
In [44]: table
Out[44]:
<Table length=9>
defocus source Chi2 xcentroid ycentroid FWHMx FWHMy Peak
float32 float32 float32 float32 float32 float32 float32 float32
------- ------- ------- --------- --------- ------- ------- -------
-0.3 0.0 346.648 2056.5 55.82 11.8635 11.8635 182.277
-0.3 4.0 148.302 2056.49 1911.02 6.66554 6.66554 299.074
-0.3 8.0 347.208 2056.51 3922.99 6.83129 6.83129 326.476
-0.26 0.0 318.489 2056.5 55.8803 10.206 10.206 195.055
-0.26 4.0 152.501 2056.51 1911.02 6.9012 6.9012 244.817
-0.26 8.0 285.845 2056.49 3922.99 7.7939 7.7939 236.194
-0.22 0.0 264.113 2056.5 55.9053 8.79704 8.79704 187.376
-0.22 4.0 163.228 2056.5 1911.02 2.43716 2.43716 402.182
-0.22 8.0 230.017 2056.5 3922.99 6.70312 6.70312 235.376
In [45]: type(table)
Out[45]: astropy.table.table.Table
In [46]: cols=table.columns
In [47]: type(cols)
Out[47]: astropy.table.table.TableColumns
In [48]: type(cols[0])
Out[48]: astropy.table.column.Column
In [50]: mylist_1 = [x for x in cols]
In [51]: mylist_2 = [cols[k] for k in range(len(cols))]
In [52]: type(mylist_1[0])
Out[52]: str
In [53]: type(mylist_2[0])
Out[53]: astropy.table.column.Column
In [54]: mylist_1[0]
Out[54]: 'defocus'
In [55]: mylist_2[0]
Out[55]:
<Column name='defocus' dtype='float32' length=9>
-0.3
-0.3
-0.3
-0.26
-0.26
-0.26
-0.22
-0.22
-0.22
我期待这两行:
mylist_1 = [x for x in cols]
和
mylist_2 = [cols[k] for k in range(len(cols))]
会得到完全相同的东西(第二个不太优雅),但事实并非如此,正如您在上面的输出中看到的那样(mylist_1 仅包含列名称,而不包含列他们自己)。为什么?关于我的 "cols" 对象,有什么我不太了解的地方吗?
感谢您的见解。
(我 运行 在尝试将我的 table 写入适合的文件时 - 使用 astropy.io.fits - 这需要构建一个适当的列列表,这不是很明显正如人们所期望的那样...)
astropy.table.table.TableColumns是astropy包的定义项。它是 class TableColumns 的一个实例,基本上您不应该使用迭代器 "cols[k]" 或 "in cols".
访问它但是在 class 中你可以定义方法 contains() 和 getitem() 来描述行为这两个请求。参见 https://infohost.nmt.edu/tcc/help/pubs/python/web/special-methods.html
这里定义的行为似乎与class元素列表不相似。也许一些文档在 astropy classes 上可用。
您的循环在列上的迭代略有不同(但等效)。 但是 你在列表理解中附加了不同的东西。这些列类似于 dict
,因此它们具有索引和关联元素:
考虑这样的 table:
from astropy.table import Table
data_rows = [(1, 2.0, 'x'),
(4, 5.0, 'y'),
(5, 8.2, 'z')]
t = Table(rows=data_rows, names=('a', 'b', 'c'), meta={'name': 'first table'},
dtype=('i4', 'f8', 'S1'))
cols=t.columns
您使用以下方法遍历 列索引:
[x for x in cols]
# ['a', 'b', 'c']
或
[k for k in range(len(cols))]
# [0, 1, 2]
这些看起来不同,但 cols[0] == cols['a']
所以这些只是为您的列编制索引的两种不同方式。
但是如果你想迭代实际列而不是它们的索引,你可以这样做:
[cols[x] for x in cols]
# [<Column name='a' dtype='int32' length=3>1 4 5,
# <Column name='b' dtype='float64' length=3>2.0 5.0 8.2,
# <Column name='c' dtype='bytes1' length=3> x y z]
或:
[cols[k] for k in range(len(cols))]
# [<Column name='a' dtype='int32' length=3>1 4 5,
# <Column name='b' dtype='float64' length=3>2.0 5.0 8.2,
# <Column name='c' dtype='bytes1' length=3> x y z]
这次我们实际插入的是索引列,而不是插入索引。
然而,这并不能解决您转换为 FITS 的问题,但您始终可以将 Table 直接保存为他们的任何格式,请参阅 their supported formats。
例如,写入 fits 就像使用一样简单:
t.write('new_table.fits')
或
t.write('new_table.fits', format='fits')
astropy.table.table.TableColumns
对象(通过 columns
属性访问)是一个 有序字典 ,而不是列表。这就是 [x for x in cols]
给出列名列表的原因(与遍历普通字典相同,给出的是键,而不是值)。
为了方便起见,它还支持索引访问和切片,如 col[0]
或 cols[1:3]
。但即使它支持类似列表的访问,TableColumns
首先也是最重要的一个字典。
在 PR #4394 中将添加一个新的 itercols()
方法,它将支持 cols_list = [x for x in t.itercols()]
。