数据表 (astropy.table
)¶
介绍¶
astropy.table
提供以熟悉的方式存储和操作异构数据表的功能 numpy
用户。该软件包的几个显著功能是:
入门¶
创建表、访问表元素和修改表的基本工作流如下所示。这些例子展示了一个简洁的案例,而 astropy.table
文档可从 使用 table 部分。
首先创建一个简单的表,其中包含名为 a
, b
, c
和 d
. 这些列有integer、float、string和 Quantity
数值分别为:
>>> from astropy.table import QTable
>>> import astropy.units as u
>>> import numpy as np
>>> a = np.array([1, 4, 5], dtype=np.int32)
>>> b = [2.0, 5.0, 8.5]
>>> c = ['x', 'y', 'z']
>>> d = [10, 20, 30] * u.m / u.s
>>> t = QTable([a, b, c, d],
... names=('a', 'b', 'c', 'd'),
... meta={'name': 'first table'})
评论:
柱
a
是一个numpy
使用指定的数组dtype
属于int32
. 如果未提供数据类型,则整数的默认类型为int64
在Mac和Linux上int32
在Windows上。柱
b
是一个列表float
值,表示为float64
.柱
c
是一个列表str
值,以unicode表示。看到了吗 Bytestring列 更多信息。柱
d
是一个Quantity
数组。自从我们用过QTable
,这将存储一个本机Quantity
在桌子里,带来了 单位和数量 (astropy.units ) 到表中的此列。
注解
如果表数据没有单位或您不想使用 Quantity
,然后您可以使用 Table
类来创建表。这个 only 两者之间的区别 QTable
和 Table
添加具有单位的列时的行为。看到了吗 数量和数量 和 带单位的列 有关差异和用例的详细信息。
还有很多其他的方法 构造表 ,包括来自行列表(元组或dict),来自 numpy
结构化或二维数组,通过增量添加列或行,甚至从 pandas.DataFrame
.
有几种方法 访问表 . 您可以获得有关表值和列定义的详细信息,如下所示:
>>> t
<QTable length=3>
a b c d
m / s
int32 float64 str1 float64
----- ------- ---- -------
1 2.0 x 10.0
4 5.0 y 20.0
5 8.5 z 30.0
您可以按如下方式获取有关表的摘要信息:
>>> t.info
<QTable length=3>
name dtype unit class
---- ------- ----- --------
a int32 Column
b float64 Column
c str1 Column
d float64 m / s Quantity
在Jupyter笔记本中,表显示为格式化的HTML表(可以通过改变 astropy.table.default_notebook_table_class
配置项):

或者你可以在浏览器中搜索到一个更漂亮的笔记本电脑界面,并使用 show_in_notebook
:

如果打印表格(从笔记本或在文本控制台会话中),则会显示格式化版本:
>>> print(t)
a b c d
m / s
--- --- --- -----
1 2.0 x 10.0
4 5.0 y 20.0
5 8.5 z 30.0
如果您不喜欢特定列的格式,可以更改它:
>>> t['b'].info.format = '7.3f'
>>> print(t)
a b c d
m / s
--- ------- --- -----
1 2.000 x 10.0
4 5.000 y 20.0
5 8.500 z 30.0
对于长表格,您可以在表格中上下滚动一页:
>>> t.more()
也可以在浏览器中将其显示为HTML格式的表:
>>> t.show_in_browser()
或作为交互式(可搜索和可排序)javascript表:
>>> t.show_in_browser(jsviewer=True)
现在检查有关表的一些高级信息:
>>> t.colnames
['a', 'b', 'c', 'd']
>>> len(t)
3
>>> t.meta
{'name': 'first table'}
使用“熟悉”按列或行访问数据 numpy
结构化数组语法:
>>> t['a'] # Column 'a'
<Column name='a' dtype='int32' length=3>
1
4
5
>>> t['a'][1] # Row 1 of column 'a'
4
>>> t[1] # Row object for table row index=1
<Row index=1>
a b c d
m / s
int32 float64 str1 float64
----- ------- ---- -------
4 5.000 y 20.0
>>> t[1]['a'] # Column 'a' of row 1
4
可以按行(使用切片)或按列(使用列名)检索表的子集,其中该子集将作为新表返回:
>>> print(t[0:2]) # Table object with rows 0 and 1
a b c d
m / s
--- ------- --- -----
1 2.000 x 10.0
4 5.000 y 20.0
>>> print(t['a', 'c']) # Table with cols 'a', 'c'
a c
--- ---
1 x
4 y
5 z
修改表 “就位”非常灵活,可以像您预期的那样工作:
>>> t['a'][:] = [-1, -2, -3] # Set all column values in place
>>> t['a'][2] = 30 # Set row 2 of column 'a'
>>> t[1] = (8, 9.0, "W", 4 * u.m / u.s) # Set all row values
>>> t[1]['b'] = -9 # Set column 'b' of row 1
>>> t[0:2]['b'] = 100.0 # Set column 'b' of rows 0 and 1
>>> print(t)
a b c d
m / s
--- ------- --- -----
-1 100.000 x 10.0
8 100.000 W 4.0
30 8.500 z 30.0
使用以下内容替换、添加、删除和重命名列:
>>> t['b'] = ['a', 'new', 'dtype'] # Replace column b (different from in-place)
>>> t['e'] = [1, 2, 3] # Add column d
>>> del t['c'] # Delete column c
>>> t.rename_column('a', 'A') # Rename column a to A
>>> t.colnames
['A', 'b', 'd', 'e']
将新数据行添加到表中如下所示。请注意,单位值在中给出 cm / s
但将作为 0.1 m / s
与现有单位一致。
>>> t.add_row([-8, 'string', 10 * u.cm / u.s, 10])
>>> len(t)
4
您可以创建一个支持缺失值的表,例如,通过设置 masked=True
::
>>> t = QTable([a, b, c], names=('a', 'b', 'c'), masked=True, dtype=('i4', 'f8', 'U1'))
>>> t['a'].mask = [True, True, False]
>>> t
<QTable masked=True length=3>
a b c
int32 float64 str1
----- ------- ----
-- 2.0 x
-- 5.0 y
5 8.5 z
除了 Quantity
,可以包括某些对象类型,例如 Time
, SkyCoord
和 NdarrayMixin
在你的桌子上。这些“mixin”列的行为类似于常规 Column
以及本机对象类型(请参见 混合柱 )例如::
>>> from astropy.time import Time
>>> from astropy.coordinates import SkyCoord
>>> tm = Time(['2000:002', '2002:345'])
>>> sc = SkyCoord([10, 20], [-45, +40], unit='deg')
>>> t = QTable([tm, sc], names=['time', 'skycoord'])
>>> t
<QTable length=2>
time skycoord
deg,deg
object object
--------------------- ----------
2000:002:00:00:00.000 10.0,-45.0
2002:345:00:00:00.000 20.0,40.0
现在让我们计算一下 Chandra X-ray Observatory 在船上 STS-93 把这个作为一个 Quantity
天数:
>>> dt = t['time'] - Time('1999-07-23 04:30:59.984')
>>> t['dt_cxo'] = dt.to(u.d)
>>> t['dt_cxo'].info.format = '.3f'
>>> print(t)
time skycoord dt_cxo
deg,deg d
--------------------- ---------- --------
2000:002:00:00:00.000 10.0,-45.0 162.812
2002:345:00:00:00.000 20.0,40.0 1236.812
性能提示¶
>>> from astropy.table import Table
>>> t = Table(names=['a', 'b'])
>>> for i in range(100):
... t.add_row((1, 2))
如果确实需要在代码中循环以创建行,一种更快的方法是构造一个行列表,然后创建 Table
最后的对象:
>>> rows = []
>>> for i in range(100):
... rows.append((1, 2))
>>> t = Table(rows=rows, names=['a', 'b'])
写一篇 Table
具有 MaskedColumn
到 .ecsv
使用 write()
可能很慢:
>>> from astropy.table import Table
>>> import numpy as np
>>> x = np.arange(10000, dtype=float)
>>> tm = Table([x], masked=True)
>>> tm.write('tm.ecsv', overwrite=True)
如果你想写 .ecsv
使用 write()
然后使用 serialize_method='data_mask'
. 这将使用非屏蔽版本的数据,而且速度更快:
>>> tm.write('tm.ecsv', overwrite=True, serialize_method='data_mask')
Read FITS with memmap=True¶
默认情况下 read()
将整个表读入内存,这可能会占用大量内存,也可能会占用大量时间,具体取决于表大小和文件格式。在某些情况下,通过选择选项,可以只读取表的一个子集 memmap=True
.
对于FITS二进制表,数据是逐行存储的,并且可以只读取行的子集,但是读取整列会将整个表数据加载到内存中:
>>> import numpy as np
>>> from astropy.table import Table
>>> tbl = Table({'a': np.arange(1e7),
... 'b': np.arange(1e7, dtype=float),
... 'c': np.arange(1e7, dtype=float)})
>>> tbl.write('test.fits', overwrite=True)
>>> table = Table.read('test.fits', memmap=True) # Very fast, doesn't actually load data
>>> table2 = tbl[:100] # Fast, will read only first 100 rows
>>> print(table2) # Accessing column data triggers the read
a b c
---- ---- ----
0.0 0.0 0.0
1.0 1.0 1.0
2.0 2.0 2.0
... ... ...
98.0 98.0 98.0
99.0 99.0 99.0
Length = 100 rows
>>> col = table['my_column'] # Will load all table into memory
目前 read()
不支持 memmap=True
对于HDF5和ASCII文件格式。
参考/API¶
astropy.table公司包裹¶
功能¶
|
沿列堆叠表格(水平) |
|
在指定的键上执行左表与右表的联接。 |
|
表示输入表 |
|
取一组表行的差异。 |
|
返回表的唯一行。 |
|
垂直堆叠表格(沿行) |
|
按深度排列表中的列 |
|
使用距离匹配在SkyCoord列上加入的帮助函数。 |
|
使用距离匹配连接表列的助手函数。 |
Classes¶
|
纯Python中的一种基本的二进制搜索树,用作索引引擎。 |
|
定义要在表对象中使用的数据列。 |
|
|
|
用于存储诸如名称、描述、格式等元信息的容器。 |
|
的配置参数 |
|
提供表的交互式HTML导出。 |
|
定义在表对象中使用的屏蔽数据列。 |
|
Mixin column类允许在表中存储任意numpy ndarray。 |
|
表示异构数据表的类。 |
|
表示表对象的一行的类。 |
|
快速的基于树的索引实现,使用 |
dict的子类,在表示中用于包含mixin属性(主数据或类似数组的属性)的名称(以及可能的其他信息),该属性被序列化为表中的列。 |
|
|
使用numpy数组列表实现已排序的数组容器。 |
警告类,用于为字符串列分配由于基(numpy)字符串长度太短而被截断的值。 |
|
|
表示异构数据表的类。 |
|
为表子类定义自定义属性的描述符。 |
|
一组列的OrderedDict子类。 |
|
|
当通过替换表列时的警告类 Table.__setitem__ 语法,例如。 |