表索引¶
一度なると Table
作成後、テーブルの1つまたは複数の列にインデックスを作成することができます。インデックスは、インデックス列に基づいてテーブルの行を内部順位付けすることにより、要素を列値で検索し、いくつかのテーブル操作の性能を向上させることができる。
索引を作成する¶
表にインデックスを作成する場合は、ご利用ください add_index()
方法:
>>> from astropy.table import Table
>>> t = Table([(2, 3, 2, 1), (8, 7, 6, 5)], names=('a', 'b'))
>>> t.add_index('a')
オプションのパラメータ unique
一意の値を有する要素を有するインデックスを作成するように指定することができる。
複数の列に複合インデックスを作成するには、転送列リストに変更してください。
>>> t.add_index(['a', 'b'])
特に、使用 add_index()
方法は、デフォルトインデックスまたは“マスターキー”とみなされる。表から索引を検索する場合は、ご利用ください indices
物件::
>>> t.indices['a']
a rows
--- ----
1 3
2 0
2 2
3 1
>>> t.indices['a', 'b']
a b rows
--- --- ----
1 5 3
2 6 2
2 8 0
3 7 1
索引を用いて行検索を行う¶
行検索は2つの表属性を用いて行うことができる: loc
そして iloc
それがそうです。♪the loc
属性は列の値,列の値の範囲( 含める 境界)、または列値のリストまたは列:
>>> t = Table([(1, 2, 3, 4), (10, 1, 9, 9)], names=('a', 'b'), dtype=['i8', 'i8'])
>>> t.add_index('a')
>>> t.loc[2]
<Row index=1>
a b
int64 int64
----- -----
2 1
>>> t.loc[[1, 4]]
<Table length=2>
a b
int64 int64
----- -----
1 10
4 9
>>> t.loc[1:3]
<Table length=3>
a b
int64 int64
----- -----
1 10
2 1
3 9
>>> t.loc[:]
<Table length=4>
a b
int64 int64
----- -----
1 10
2 1
3 9
4 9
デフォルトの場合、 loc
主インデックスを用いて,ここでは列‘a’である.他のインデックスを使用するには、データを検索する前にインデックス列名を渡してください:
>>> t.add_index('b')
>>> t.loc['b', 8:10]
<Table length=3>
a b
int64 int64
----- -----
3 9
4 9
1 10
その物件. iloc
動作原理は類似しており、検索情報は整数またはスライスでなければならず、列値に関連するのではなく、インデックスの順序に関連していなければならない。例えば:
>>> t.iloc[0] # smallest row by value 'a'
<Row index=0>
a b
int64 int64
----- -----
1 10
>>> t.iloc['b', 1:] # all but smallest value of 'b'
<Table length=3>
a b
int64 int64
----- -----
3 9
4 9
1 10
性能への影響¶
インデックスが存在する場合には,表操作が若干変化し,インデックスを用いることで性能が向上するかどうかを決定する際には,多くの要因を考慮する必要がある.一般に、インデックスは、以下の利点を提供する。
インデックス列に基づくテーブルのグループ化とソートの両方が速くなる。
インデックスによる検索値はカスタム検索よりも速い.
しかしいくつかの警告があります
インデックスを作成するのに時間とメモリが必要です。
自動インデックス更新のため,表の修正がより遅くなっている.
インデックスが再表記されるため,スライス表が遅くなる.
見 here テーブルインデックスの様々な側面を分析するためのIPythonノート。
索引パターン¶
The index_mode()
method allows for some flexibility in the behavior of table
indexing by allowing the user to enter a specific indexing mode via a context
manager. There are currently three indexing modes: freeze
,
copy_on_getitem
, and discard_on_copy
.
♪the freeze
モードは、インデックスの列が修正される度に自動的にインデックスが更新されることを防止し、すべてのインデックスがコンテキスト終了後に自動的にリフレッシュされることを
>>> with t.index_mode('freeze'):
... t['a'][0] = 0
... print(t.indices['a']) # unmodified
a rows
--- ----
1 0
2 1
3 2
4 3
>>> print(t.indices['a']) # modified
a rows
--- ----
0 0
2 1
3 2
4 3
♪the copy_on_getitem
パターン強制列は,スライス時にそのインデックスをコピーして再タグ付けする.このモードがない場合、表スライスはインデックスを保持し、列スライスはそうではない。
>>> ca = t['a'][[1, 3]]
>>> ca.info.indices
[]
>>> with t.index_mode('copy_on_getitem'):
... ca = t['a'][[1, 3]]
... print(ca.info.indices)
[ a rows
--- ----
2 0
4 1]
♪the discard_on_copy
モードは、列またはテーブルをコピーする際にインデックスをコピーすることを防止することができる:
>>> t2 = Table(t)
>>> t2.indices['a']
a rows
--- ----
0 0
2 1
3 2
4 3
>>> t2.indices['b']
b rows
--- ----
1 1
9 2
9 3
10 0
>>> with t.index_mode('discard_on_copy'):
... t2 = Table(t)
... print(t2.indices)
[]
インデックスを用いて行を更新する¶
行更新は表属性を代入することで行うことができる loc
行全体または列:
>>> t = Table([('w', 'x', 'y', 'z'), (10, 1, 9, 9)], names=('a', 'b'), dtype=['str', 'i8'])
>>> t.add_index('a')
>>> t.loc['x']
<Row index=1>
a b
str1 int64
---- -----
x 1
>>> t.loc['x'] = ['a', 12]
>>> t
<Table length=4>
a b
str1 int64
---- -----
w 10
a 12
y 9
z 9
>>> t.loc[['w', 'y']]
<Table length=2>
a b
str1 int64
---- -----
w 10
y 9
>>> t.loc[['w', 'z']] = [['b',23], ['c',56]]
>>> t
<Table length=4>
a b
str1 int64
---- -----
b 23
a 12
y 9
c 56
索引を用いて行の位置を検索する¶
表属性を用いて行位置の検索を実現することができる: loc_indices
それがそうです。♪the loc_indices
属性は列の値,列の値の範囲( 含める 境界)、または列値のリストまたは列:
>>> t = Table([('w', 'x', 'y', 'z'), (10, 1, 9, 9)], names=('a', 'b'), dtype=['str', 'i8'])
>>> t.add_index('a')
>>> t.loc_indices['x']
1
エンジン¶
以下のようにインデックスを作成する場合 add_index()
キーワードパラメータ engine
特定のインデックスエンジンの使用を指定することができる.利用可能なエンジンには
SortedArray
ベースソートを用いた整列化配列エンジンである.Table
それがそうです。SCEngine
, a sorted list engine using the Sorted Containers 小包です。BST
Pythonベースのバイナリ検索木エンジンです
SCEngineは sortedcontainers
依存性。最も重要なのは SortedArray
(デフォルトエンジン)通常は最高ですが SCEngine
新しい値を追加した方が速いので、空列上に作成されたインデックスに適しているかもしれません。