データ処理関数とデータコンテナ#
一般にデータ処理を行う場合、様々なパラメータとともに多段階の処理を行う。各段階の処理はそれぞれ個別の関数として準備され、それら関数を順次実行することで処理を進めてゆく。これまで述べてきた万葉ライブラリのデータコンテナとそのデータの扱い方を用いれば、Python上で必要な機能を持った関数を作成し実行できる。しかし処理速度などの問題から、主なデータ処理の関数はC++言語で書かれているはずである。
万葉ライブラリでは、C++で書かれた関数も基盤部分を共通化することを目指している。なぜなら、この共通化によって
関数の使い方が統一される
独自機能の関数を開発する時に、開発作業が軽減される
といった利点が生じるためである。 ここでは、万葉ライブラリの関数開発には踏み込まないが、データコンテナと万葉ライブラリで推奨する関数との関係を簡単に紹介する。
想定するデータ処理#
先に述べたような多段階の処理を実行するにあたり、万葉ライブラリが想定するデータ処理とは以下のようなものである(Fig.6も参照)。
データコンテナにデータが入っている
処理のステップで、関数に入力としてデータコンテナ、また処理に必要なパラメータを与える
関数の実行
出力としてデータコンテナを取り出す
これを新たに次の処理の入力として用いる(2へ戻る)
このように、データコンテナを媒介に処理を進めてゆく。万葉ライブラリではこの関数を「演算子」と名付けている。
データコンテナと処理パラメータ#
ここで、データコンテナと処理のパラメータの違いを述べておく。
データコンテナは、処理をされる側のデータであり、同時にそのデータに関する情報(メタデータ)も持つ。一方、処理を行う際に必要となる情報のうち、処理ごとに変更される可能性のあるパラメータと、ある程度固定化されたパラメータが存在する。よって、ある程度固定化されたパラメータは、データコンテナのメタデータとして保存されておくほうが効率が良い。よってあらかじめデータコンテナには、固定化されているパラメータをヘッダ部に登録しておくべきである。これらの具体的な例は、第8章の「MLFにおける利用例」にて簡単に触れる。
関数(演算子)のタイプ#
演算子には二つのタイプがある。
入力したデータコンテナがそのまま出力になる(単純演算子:Fig.7 )
入力したデータコンテナと異なるデータコンテナが出力される(汎用演算子:Fig.8)
実際に関数がどのような形で実装されているかは、その機能に依存する。データコンテナの構造が変わらない関数、例えば全データを特定の値で割る、全データの強度をある関数で補正する、などの場合は1.単純演算子が用いられる。一方、円環平均をとったり全データの積算値を得たりする場合、すなわち明らかに入力データと出力データの構造が異なる場合は、2.汎用演算子が用いられる。
ただしTable 22に示すように、単純演算子と汎用演算子とでデータコンテナの入力コマンドが異なっているため、使用時には注意が必要である。
入力コマンド |
出力コマンド |
|
---|---|---|
単純演算子 |
SetTarget( *T ) |
なし or Put() |
汎用演算子 |
SetInput( T ), SetInputP( *T ) |
Put() |
使用例:
単純演算子型の関数の使用例を示す。
1import Manyo.Utsusemi as mu
2kikf = mu.KiKfCorrection()
3kikf.SetTarget(dat) #データの入力
4kikf.KiKfCorrect() #処理の実行 この時点で'dat'は処理済み
5del kikf
汎用演算子型の関数の使用例を示す。
1import Manyo.SAS as ms
2esub = ms.EcmSubtruction()
3esub.SetInputP( dat1 ) #データの入力
4esub.Subtract( dat2 ) #パラメータ入力と処理の実行
5dat3 = esub.Put() #結果の出力
6del esub