アクセス表.

アクセス表の属性とデータは、通常、基本インタフェースと一致する numpy 構造化配列.

基礎知識.

高速な概要のために,次のコードはアクセス表データの基本知識を示す.関連する箇所には、どのオブジェクトを返すかに関する注釈があります。別の説明がない限り、テーブルアクセスは、元の表データまたは属性を更新するために修正可能なオブジェクトを返す。別項参照 複製と引用 この話題についてより多くの情報を知ることができます

机を作る **

from astropy.table import Table
import numpy as np

arr = np.arange(15).reshape(5, 3)
t = Table(arr, names=('a', 'b', 'c'), meta={'keywords': {'key1': 'val1'}})

表属性. **

t.columns   # Dict of table columns (access by column name, index, or slice)
t.colnames  # List of column names
t.meta      # Dict of meta-data
len(t)      # Number of table rows

アクセス表データ **

t['a']       # Column 'a'
t['a'][1]    # Row 1 of column 'a'
t[1]         # Row obj for with row 1 values
t[1]['a']    # Column 'a' of row 1
t[2:5]       # Table object with rows 2:5
t[[1, 3, 4]]  # Table object with rows 1, 3, 4 (copy)
t[np.array([1, 3, 4])]  # Table object with rows 1, 3, 4 (copy)
t[[]]        # Same table definition but with no rows of data
t['a', 'c']  # Table with cols 'a', 'c' (copy)
dat = np.array(t)  # Copy table data to numpy structured array object
t['a'].quantity  # an astropy.units.Quantity for Column 'a'
t['a'].to('km')  # an astropy.units.Quantity for Column 'a' in units of kilometers
t.columns[1]  # Column 1 (which is the 'b' column)
t.columns[0:2]  # New table with columns 0 and 1

注釈

ほぼ等しいように見えますが、それらの間には2つの性能差の要素があります t[1]['a'] (スピードが遅い、中級だから Row オブジェクトが作成された)と t['a'][1] (もっと速い)。できれば、常に後者を使ってください。

印刷表や列 **

print(t)     # Print formatted version of table to the screen
t.pprint()   # Same as above
t.pprint(show_unit=True)  # Show column unit
t.pprint(show_name=False)  # Do not show column names
t.pprint_all() # Print full table no matter how long / wide it is (same as t.pprint(max_lines=-1, max_width=-1))

t.more()  # Interactively scroll through table like Unix "more"

print(t['a'])    # Formatted column values
t['a'].pprint()  # Same as above, with same options as Table.pprint()
t['a'].more()    # Interactively scroll through column

lines = t.pformat()  # Formatted table as a list of lines (same options as pprint)
lines = t['a'].pformat()  # Formatted column values as a list

細かい点

以下のすべての例について、以下のようにテーブルが作成されたと仮定する。

>>> from astropy.table import Table, Column
>>> import numpy as np
>>> import astropy.units as u

>>> arr = np.arange(15, dtype=np.int32).reshape(5, 3)
>>> t = Table(arr, names=('a', 'b', 'c'), meta={'keywords': {'key1': 'val1'}})
>>> t['a'].format = "%6.3f"  # print as a float with 3 digits after decimal point
>>> t['a'].unit = 'm sec^-1'
>>> t['a'].description = 'unladen swallow velocity'
>>> print(t)
     a      b   c
  m sec^-1
  -------- --- ---
     0.000   1   2
     3.000   4   5
     6.000   7   8
     9.000  10  11
    12.000  13  14

注釈

In the example above the format, unit, and description attributes of the Column were set directly. For 混合柱 like Quantity you must set via the info attribute, for example, t['a'].info.format = "%6.3f". You can use the info attribute with Column objects as well, so the general solution that works with any table column is to set via the info attribute. See 混合属性 for more information.

要約情報

この表に関する要約情報は、以下のように取得することができます。

>>> t.info
<Table length=5>
name dtype   unit   format       description
---- ----- -------- ------ ------------------------
   a int32 m sec^-1  %6.3f unladen swallow velocity
   b int32
   c int32

関数として呼び出すと,提供することができる option これは、返すメッセージタイプを指定します。内蔵の option 選択可能なのは attributes (列属性、これはデフォルト属性)または stats (基本列統計情報).♪the option パラメータはまた、利用可能なオプションリストであってもよい:

>>> t.info('stats')  
<Table length=5>
name mean      std      min max
---- ---- ------------- --- ---
   a  6.0 4.24264068712   0  12
   b  7.0 4.24264068712   1  13
   c  8.0 4.24264068712   2  14

>>> t.info(['attributes', 'stats'])  
<Table length=5>
name dtype   unit   format       description        mean      std      min max
---- ----- -------- ------ ------------------------ ---- ------------- --- ---
   a int32 m sec^-1  %6.3f unladen swallow velocity  6.0 4.24264068712   0  12
   b int32                                           7.0 4.24264068712   1  13
   c int32                                           8.0 4.24264068712   2  14

列はまだ持っている info アクションおよびパラメータを有する属性であるが、単一の列に関する情報を提供する:

>>> t['a'].info
name = a
dtype = int32
unit = m sec^-1
format = %6.3f
description = unladen swallow velocity
class = Column
n_bad = 0
length = 5

>>> t['a'].info('stats')  
name = a
mean = 6.0
std = 4.24264068712
min = 0
max = 12
n_bad = 0
length = 5

アクセス属性

次のコードはアクセスリストを以下のように表示する TableColumns オブジェクトは,列名,表メタデータ,表行数を取得する.表メタデータは秩序辞書です (OrderedDict) デフォルトの場合。**

>>> t.columns
<TableColumns names=('a','b','c')>

>>> t.colnames
['a', 'b', 'c']

>>> t.meta  # Dict of meta-data
{'keywords': {'key1': 'val1'}}

>>> len(t)
5

データにアクセスする

案の定、名前でリストにアクセスし、その列からデジタルインデックス付き要素を取得することができます:

>>> t['a']  # Column 'a'
<Column name='a' dtype='int32' unit='m sec^-1' format='%6.3f' description='unladen swallow velocity' length=5>
 0.000
 3.000
 6.000
 9.000
12.000


>>> t['a'][1]  # Row 1 of column 'a'
3

表列を印刷する際には、 format 属性(参照 書式説明子 )である。上の列表示形式と以下のように表示される点の違いに注意してください print() あるいは…。 str() **

>>> print(t['a'])
   a
m sec^-1
--------
   0.000
   3.000
   6.000
   9.000
  12.000

同様に、表行およびその行の列を選択することができる。

>>> t[1]  # Row object corresponding to row 1
<Row index=1>
   a       b     c
m sec^-1
 int32   int32 int32
-------- ----- -----
   3.000     4     5

>>> t[1]['a']  # Column 'a' of row 1
3

A Row オブジェクトはその親表と同じ列とメタデータを持つ:

>>> t[1].columns
<TableColumns names=('a','b','c')>

>>> t[1].colnames
['a', 'b', 'c']

表をスライスすると、スライス領域内の元のデータが参照される新しい表オブジェクトが返される(参照)。 複製と引用 )である。表のメタデータと列定義をコピーする.**

>>> t[2:5]  # Table object with rows 2:5 (reference)
<Table length=3>
   a       b     c
m sec^-1
 int32   int32 int32
-------- ----- -----
   6.000     7     8
   9.000    10    11
  12.000    13    14

テーブル行は、インデックス配列を使用して、または複数の列名を指定することで選択することができる。これは、選択された行または列の元の表のコピーを返す。**

>>> print(t[[1, 3, 4]])  # Table object with rows 1, 3, 4 (copy)
     a      b   c
  m sec^-1
  -------- --- ---
     3.000   4   5
     9.000  10  11
    12.000  13  14


>>> print(t[np.array([1, 3, 4])])  # Table object with rows 1, 3, 4 (copy)
     a      b   c
  m sec^-1
  -------- --- ---
     3.000   4   5
     9.000  10  11
    12.000  13  14


>>> print(t['a', 'c'])  # or t[['a', 'c']] or t[('a', 'c')]
...                     # Table with cols 'a', 'c' (copy)
     a      c
  m sec^-1
  -------- ---
     0.000   2
     3.000   5
     6.000   8
     9.000  11
    12.000  14

条件を使用して表から行を選択してブーリアンマスクを作成することができる.ブール配列を使用してインデックスを作成するテーブルは、マスク配列要素が存在する行のみを返す。 True それがそうです。ビット演算子ごとに異なる条件を組み合わせることができる.**

>>> mask = (t['a'] > 4) & (t['b'] > 8)  # Table rows where column a > 4
>>> print(t[mask])                      # and b > 8
...
     a      b   c
  m sec^-1
  -------- --- ---
     9.000  10  11
    12.000  13  14

最後に、当機として基礎表データにアクセスすることができます numpy コピーまたは参照の作成を使用して構造化配列を作成する np.array **

>>> data = np.array(t)  # copy of data in t as a structured array
>>> data = np.array(t, copy=False)  # reference to data in t

表が等しい

2つの異なる方法で表データの一貫性をチェックすることができます

  • ♪the == 比較演算子。これは1つに戻ります True あるいは…。 False すべての行について 整行する. マッチです。これは行為と同じです numpy 構造化配列.

  • values_equal() 表の値を要素ごとに比較するには,以下の操作を実行してください.これはブール値に戻ります True あるいは…。 False それぞれの表に対して 元素.元素 だからあなたは1つを得ることができます Table 価値観。

実例.

テーブルが等しいかどうかをチェックするには、以下の操作を実行してください。

>>> t1 = Table(rows=[[1, 2, 3],
...                  [4, 5, 6],
...                  [7, 7, 9]], names=['a', 'b', 'c'])
>>> t2 = Table(rows=[[1, 2, -1],
...                  [4, -1, 6],
...                  [7, 7, 9]], names=['a', 'b', 'c'])

>>> t1 == t2
array([False, False,  True])

>>> t1.values_equal(t2)  # Compare to another table
<Table length=3>
 a     b     c
bool  bool  bool
---- ----- -----
True  True False
True False  True
True  True  True

>>> t1.values_equal([2, 4, 7])  # Compare to an array column-wise
<Table length=3>
  a     b     c
 bool  bool  bool
----- ----- -----
False  True False
 True False False
 True  True False

>>> t1.values_equal(7)  # Compare to a scalar column-wise
<Table length=3>
  a     b     c
 bool  bool  bool
----- ----- -----
False False False
False False False
 True  True False

フォーマット印刷.

フォーマットテーブルとしてテーブルまたは列の値を印刷または検索する方法のうちの1つを使用することができる。

  • print() 機能します。

  • more() または列 more() 方法:閲覧表の値を交互にスクロールする.

  • pprint() または列 pprint() 方法フォームのフォーマットバージョンを画面に印刷する。

  • pformat() または列 pformat() 方法は、フォーマットされたテーブルまたは列を固定幅文字列リストの形態で返す。これは保存表のショートカットとして用いることができる.

これらの方法は 書式説明子 利用可能であれば,出力に可読性を持たせるように努力する.デフォルトでは、フォームおよび列印刷は、利用可能な対話型画面サイズよりも大きいフォームを印刷しない。画面サイズ(非インタラクティブ環境またはWindows上)が決定できない場合には、25行×80列のデフォルトサイズが使用されます。テーブルが大きすぎる場合は、行および/または列を中間から切り出して適合させる。

例を引く

フォーマットテーブルを印刷するには、以下の操作を実行してください。

>>> arr = np.arange(3000).reshape(100, 30)  # 100 rows x 30 columns array
>>> t = Table(arr)
>>> print(t)
col0 col1 col2 col3 col4 col5 col6 ... col23 col24 col25 col26 col27 col28 col29
---- ---- ---- ---- ---- ---- ---- ... ----- ----- ----- ----- ----- ----- -----
   0    1    2    3    4    5    6 ...    23    24    25    26    27    28    29
  30   31   32   33   34   35   36 ...    53    54    55    56    57    58    59
  60   61   62   63   64   65   66 ...    83    84    85    86    87    88    89
  90   91   92   93   94   95   96 ...   113   114   115   116   117   118   119
 120  121  122  123  124  125  126 ...   143   144   145   146   147   148   149
 150  151  152  153  154  155  156 ...   173   174   175   176   177   178   179
 180  181  182  183  184  185  186 ...   203   204   205   206   207   208   209
 210  211  212  213  214  215  216 ...   233   234   235   236   237   238   239
 240  241  242  243  244  245  246 ...   263   264   265   266   267   268   269
 270  271  272  273  274  275  276 ...   293   294   295   296   297   298   299
 ...  ...  ...  ...  ...  ...  ... ...   ...   ...   ...   ...   ...   ...   ...
2670 2671 2672 2673 2674 2675 2676 ...  2693  2694  2695  2696  2697  2698  2699
2700 2701 2702 2703 2704 2705 2706 ...  2723  2724  2725  2726  2727  2728  2729
2730 2731 2732 2733 2734 2735 2736 ...  2753  2754  2755  2756  2757  2758  2759
2760 2761 2762 2763 2764 2765 2766 ...  2783  2784  2785  2786  2787  2788  2789
2790 2791 2792 2793 2794 2795 2796 ...  2813  2814  2815  2816  2817  2818  2819
2820 2821 2822 2823 2824 2825 2826 ...  2843  2844  2845  2846  2847  2848  2849
2850 2851 2852 2853 2854 2855 2856 ...  2873  2874  2875  2876  2877  2878  2879
2880 2881 2882 2883 2884 2885 2886 ...  2903  2904  2905  2906  2907  2908  2909
2910 2911 2912 2913 2914 2915 2916 ...  2933  2934  2935  2936  2937  2938  2939
2940 2941 2942 2943 2944 2945 2946 ...  2963  2964  2965  2966  2967  2968  2969
2970 2971 2972 2973 2974 2975 2976 ...  2993  2994  2995  2996  2997  2998  2999
Length = 100 rows

More方法

ブラウジングテーブルや列のすべての行をご覧になりますので、ご利用ください more() または列 more() 方法:研究方法。Linuxのように各行をインタラクティブにスクロールさせることができます more 指揮部。表や列の一部を表示すると,サポートされるナビゲーションキーは:

F、スペース :1ページ進む
b :1ページに戻る
r :同じページを更新する
n :次の行
p 前の行
< :スタートに移る
> :末尾に移る
q :閲覧を終了する
h :このヘルプを印刷する

Pprint()メソッド

In order to fully control the print output use the Table pprint() or Column pprint() methods. These have keyword arguments max_lines, max_width, show_name, show_unit with meanings as shown below:

>>> arr = np.arange(3000, dtype=float).reshape(100, 30)
>>> t = Table(arr)
>>> t['col0'].format = '%e'
>>> t['col1'].format = '%.6f'
>>> t['col0'].unit = 'km**2'
>>> t['col29'].unit = 'kg sec m**-2'

>>> t.pprint(max_lines=8, max_width=40)
    col0     ...    col29
    km2      ... kg sec m**-2
------------ ... ------------
0.000000e+00 ...         29.0
         ... ...          ...
2.940000e+03 ...       2969.0
2.970000e+03 ...       2999.0
Length = 100 rows

>>> t.pprint(max_lines=8, max_width=40, show_unit=True)
    col0     ...    col29
    km2      ... kg sec m**-2
------------ ... ------------
0.000000e+00 ...         29.0
         ... ...          ...
2.940000e+03 ...       2969.0
2.970000e+03 ...       2999.0
Length = 100 rows

>>> t.pprint(max_lines=8, max_width=40, show_name=False)
    km2      ... kg sec m**-2
------------ ... ------------
0.000000e+00 ...         29.0
3.000000e+01 ...         59.0
         ... ...          ...
2.940000e+03 ...       2969.0
2.970000e+03 ...       2999.0
Length = 100 rows

出力長や幅を考慮せずにすべての値を強制的に印刷しますので、ご利用ください pprint_all() 設定に相当します max_lines そして max_width 至る -1 はい。 pprint() それがそうです。 pprint_all() 取った論拠と pprint() それがそうです。本例の広いテーブルの場合、以下に示すように、6行の改行出力が見られる。

>>> t.pprint_all(max_lines=8)  
    col0         col1     col2   col3   col4   col5   col6   col7   col8   col9  col10  col11  col12  col13  col14  col15  col16  col17  col18  col19  col20  col21  col22  col23  col24  col25  col26  col27  col28     col29
    km2                                                                                                                                                                                                               kg sec m**-2
------------ ----------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------------
0.000000e+00    1.000000    2.0    3.0    4.0    5.0    6.0    7.0    8.0    9.0   10.0   11.0   12.0   13.0   14.0   15.0   16.0   17.0   18.0   19.0   20.0   21.0   22.0   23.0   24.0   25.0   26.0   27.0   28.0         29.0
         ...         ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...          ...
2.940000e+03 2941.000000 2942.0 2943.0 2944.0 2945.0 2946.0 2947.0 2948.0 2949.0 2950.0 2951.0 2952.0 2953.0 2954.0 2955.0 2956.0 2957.0 2958.0 2959.0 2960.0 2961.0 2962.0 2963.0 2964.0 2965.0 2966.0 2967.0 2968.0       2969.0
2.970000e+03 2971.000000 2972.0 2973.0 2974.0 2975.0 2976.0 2977.0 2978.0 2979.0 2980.0 2981.0 2982.0 2983.0 2984.0 2985.0 2986.0 2987.0 2988.0 2989.0 2990.0 2991.0 2992.0 2993.0 2994.0 2995.0 2996.0 2997.0 2998.0       2999.0
Length = 100 rows

列に対してその文法や行為は pprint() すべて同じですが、ありません max_width キーワードパラメータ::

>>> t['col3'].pprint(max_lines=8)
 col3
------
   3.0
  33.0
   ...
2943.0
2973.0
Length = 100 rows

列整列方式

各列は、閲覧体験を向上させるために、様々な異なる方法で整列することができる:

>>> t1 = Table()
>>> t1['long column name 1'] = [1, 2, 3]
>>> t1['long column name 2'] = [4, 5, 6]
>>> t1['long column name 3'] = [7, 8, 9]
>>> t1['long column name 4'] = [700000, 800000, 900000]
>>> t1['long column name 2'].info.format = '<'
>>> t1['long column name 3'].info.format = '0='
>>> t1['long column name 4'].info.format = '^'
>>> t1.pprint()
 long column name 1 long column name 2 long column name 3 long column name 4
------------------ ------------------ ------------------ ------------------
                 1 4                  000000000000000007       700000
                 2 5                  000000000000000008       800000
                 3 6                  000000000000000009       900000

整列は、リストをキーワードパラメータに渡すことによって、別の方法で容易に処理することができる align **

>>> t1 = Table()
>>> t1['column1'] = [1, 2, 3]
>>> t1['column2'] = [2, 4, 6]
>>> t1.pprint(align=['<', '0='])
column1 column2
------- -------
1       0000002
2       0000004
3       0000006

単一の文字列値を使用してすべての列の整列方法を設定することもできる。

>>> t1.pprint(align='^')
column1 column2
------- -------
   1       2
   2       4
   3       6

整列のための充填文字は、整列文字のプレフィックスに設定することができる(参照 Format Specification Mini-Language より多くの説明については参照)を参照されたい.これは align パラメータは列の中にあります format 属性です。次の面白いインタラクションに注意してください

>>> t1 = Table([[1.0, 2.0], [1, 2]], names=['column1', 'column2'])

>>> t1['column1'].format = '#^.2f'
>>> t1.pprint()
column1 column2
------- -------
##1.00#       1
##2.00#       2

さて、グローバル整列を設定すると、私たちの元の列フォーマットは失われているようです。

>>> t1.pprint(align='!<')
column1 column2
------- -------
1.00!!! 1!!!!!!
2.00!!! 2!!!!!!

これを避ける方法は,列ごとに整列文字列を明示的に指定し,使用することである. None 列フォーマット:が使用されるべきである:

>>> t1.pprint(align=[None, '!<'])
column1 column2
------- -------
##1.00# 1!!!!!!
##2.00# 2!!!!!!

Pformat()方法

フォーマットされた出力を得るために操作やファイルを書き込むために、表を使ってください pformat() または列 pformat() 方法:研究方法。彼らの行動と pprint() 各フォーマット行に対応するリスト。 pprint() 出力します。♪the pformat_all() 方法は、テーブルの全ての行のリストを返すために使用することができる。

>>> lines = t['col3'].pformat(max_lines=8)

隠れ列

♪the Table クラスは、任意のPrint方法を使用する際に、テーブル内のいくつかの列を選択的に表示または隠蔽する機能を有する。これは,非常に広い列や様々な理由で“つまらない”列に有用である可能性がある.どの列を出力するかの仕様が表自体に関連付けられており,スライス,複製,直列化(たとえばECSVに保存)することで永続的に保存することができる.1つの用例は,通常ユーザにとって役に立たないサブ列を含む専用の表サブクラスである.

2つの相補的な2つの列で印刷を処理する際にどの列を含むかを指定する Table 属性:

一般的に、あなたは一度にこの二つの属性のうちの一つだけを使用しなければならない。しかし、これら2つの列を同時に設定することができ、実際に印刷された列セットは、概念的には以下の擬似コードで表される。

include_names = (set(table.pprint_include_names() or table.colnames)
                 - set(table.pprint_exclude_names() or ())
実例.

1行と6列を持つ簡単な表を定義することから始めましょう

>>> from astropy.table.table_helpers import simple_table
>>> t = simple_table(size=1, cols=6)
>>> print(t)
a   b   c   d   e   f
--- --- --- --- --- ---
1 1.0   c   4 4.0   f

今は手に入れることができます pprint_include_names 属性には、印刷のための名前がいくつか含まれています:

>>> print(t.pprint_include_names())
None
>>> t.pprint_include_names = ('a', 'c', 'e')
>>> print(t.pprint_include_names())
('a', 'c', 'e')
>>> print(t)
 a   c   e
--- --- ---
  1   c 4.0

今、印刷からいくつかの列を除外することができます。INCLUDEとEXCLUDEについては、表に存在しない列名を追加することができますのでご注意ください。これは完全な構造表の前に所定の属性を可能にする。**

>>> t.pprint_include_names = None  # Revert to printing all columns
>>> t.pprint_exclude_names = ('a', 'c', 'e', 'does-not-exist')
>>> print(t)
 b   d   f
--- --- ---
1.0   4   f

次は、どうぞ add あるいは…。 remove 属性中の名前:

>>> t = simple_table(size=1, cols=6)  # Start with a fresh table
>>> t.pprint_exclude_names.add('b')  # Single name
>>> t.pprint_exclude_names.add(['d', 'f'])  # List or tuple of names
>>> t.pprint_exclude_names.remove('f')  # Single name or list/tuple of names
>>> t.pprint_exclude_names()
('b', 'd')

最後に、コンテキストマネージャに属性を一時的に設定することができます。例えば:

>>> t = simple_table(size=1, cols=6)
>>> t.pprint_include_names = ('a', 'b')
>>> print(t)
 a   b
--- ---
  1 1.0

>>> # Show all (for pprint_include_names the value of None => all columns)
>>> with t.pprint_include_names.set(None):
...     print(t)
 a   b   c   d   e   f
--- --- --- --- --- ---
  1 1.0   c   4 4.0   f

これらの属性の名前仕様は、UnixスタイルのGLOBを含むことができる * そして ? それがそうです。見 fnmatch 詳細な情報(特にこれらの文字をどのように変換するか)を取得する.例えば:

>>> t = Table()
>>> t.pprint_exclude_names = ['boring*']
>>> t['a'] = [1]
>>> t['b'] = ['b']
>>> t['boring_ra'] = [122.0]
>>> t['boring_dec'] = [89.9]
>>> print(t)
 a   b
--- ---
  1   b

多次元列.

列に複数の次元がある場合、その列の各要素自体が配列である。以下の例では、3行あり、各行は1つである 2 x 2 配列していますこのような列のフォーマット出力は、各行要素の最初の値および最後の値のみを表示し、列名タイトルに配列次元を示す:

>>> from astropy.table import Table, Column
>>> import numpy as np
>>> t = Table()
>>> arr = [ np.array([[ 1,  2],
...                   [10, 20]]),
...         np.array([[ 3,  4],
...                   [30, 40]]),
...         np.array([[ 5,  6],
...                   [50, 60]]) ]
>>> t['a'] = arr
>>> t['a'].shape
(3, 2, 2)
>>> t.pprint()
a [2,2]
-------
1 .. 20
3 .. 40
5 .. 60

多次元列のすべてのデータ値を見るには、列表現法を使ってください。この使用基準は numpy 任意のアレイを印刷する機構:

>>> t['a'].data
array([[[ 1,  2],
        [10, 20]],
       [[ 3,  4],
        [30, 40]],
       [[ 5,  6],
        [50, 60]]])

単位付き柱

A Column 単位が標準範囲内の対象 Table (と) QTable )は、数に関連するいくつかの便利さを有する。まず明示的に変換することができます Quantity 対象通過 quantity 属性と to() 方法:

>>> data = [[1., 2., 3.], [40000., 50000., 60000.]]
>>> t = Table(data, names=('a', 'b'))
>>> t['a'].unit = u.m
>>> t['b'].unit = 'km/s'
>>> t['a'].quantity  
<Quantity [1., 2., 3.] m>
>>> t['b'].to(u.kpc/u.Myr)  
<Quantity [40.9084866 , 51.13560825, 61.3627299 ] kpc / Myr>

注意してください。 quantity 属性は実際には view 列中のデータのコピーは、コピーではありません。そのため、現地で変更することができます quantity 物件::

>>> t['b']
<Column name='b' dtype='float64' unit='km / s' length=3>
40000.0
50000.0
60000.0

>>> t['b'].quantity[0] = 45000000*u.m/u.s
>>> t['b']
<Column name='b' dtype='float64' unit='km / s' length=3>
45000.0
50000.0
60000.0

明示的な変換がなくても,単位を持つ列を見なすことができる. astropy Quantity はい。 some 算術式(この問題に関する警告は、以下の警告を参照):

>>> t['a'] + .005*u.km  
<Quantity [6., 7., 8.] m>
>>> from astropy.constants import c
>>> (t['b'] / c).decompose()  
<Quantity [0.15010384, 0.16678205, 0.20013846]>

警告

表列はいいです not いつも同じように表現されています Quantity それがそうです。表列の行為は通常の列のようなものです numpy 配列は明示的に変換されない限り Quantity あるいはそれと Quantity 算術演算子を用いる。例えば、以下の動作方式は、あなたが予想しているものとは異なる。

>>> import numpy as np
>>> from astropy.table import Table
>>> data = [[30, 90]]
>>> t = Table(data, names=('angle',))
>>> t['angle'].unit = 'deg'
>>> np.sin(t['angle'])  
<Column name='angle' dtype='float64' unit='deg' length=2>
-0.988031624093
 0.893996663601

これは間違っています単位は度だと言っているので and sin 度数ではなく値と弧を扱っている。正しい結果が得られるかどうか疑問があれば、一番安全な選択は使用です QTable 明示的に Quantity **

>>> np.sin(t['angle'].quantity)  
<Quantity [0.5, 1. ]>

バイト列.

バイト列を使う (numpy 'S' Dtype)は可能です astropy 表は自然なPython文字列と比較できるからです (str )タイプ。参照してください The bytes/str dichotomy in Python 3 異なる点を非常に簡単に要約することで。

文字列を表す標準的な方法 numpy Unicodeで 'U' データタイプです。問題は,1文字あたり4バイト必要であり,メモリに非常に多くの文字列があれば,メモリを埋めて性能に影響を与える可能性があることである.非常に一般的な例は、これらの文字列が実際にASCIIであり、各文字を1バイトで表すことができることである。はい。 astropy 中のバイト列データを直接,容易に使用することができる Table そして Column 運営部。

なお、HDF 5ファイルを処理する際には、バイト列の問題が特別な問題であり、HDF 5ファイルでは、文字データがバイト列として読み出される。 ('S' Dtype)が使用している 統一ファイル読み書きインタフェース それがそうです。HDF 5ファイルは非常に大きなデータセットを格納するためによく用いられるため,変換と 'U' データタイプは受け入れられません。

実例.

以下の例では、バイト文字列データをどのように処理するかについて説明する astropy それがそうです。

>>> t = Table([['abc', 'def']], names=['a'], dtype=['S'])

>>> t['a'] == 'abc'  # Gives expected answer
array([ True, False], dtype=bool)

>>> t['a'] == b'abc'  # Still gives expected answer
array([ True, False], dtype=bool)

>>> t['a'][0] == 'abc'  # Expected answer
True

>>> t['a'][0] == b'abc'  # Cannot compare to bytestring
False

>>> t['a'][0] = 'bä'
>>> t
<Table length=2>
  a
bytes3
------

   def

>>> t['a'] == 'bä'
array([ True, False], dtype=bool)

>>> # Round trip unicode strings through HDF5
>>> t.write('test.hdf5', format='hdf5', path='data', overwrite=True)
>>> t2 = Table.read('test.hdf5', format='hdf5', path='data')
>>> t2
<Table length=2>
 col0
bytes3
------

   def