ここでは変数操作に関する関数などについて紹介します。
具体的な解析というよりも,解析する上で便利な変数・配列に対する操作について書かれます。
データIOに関連する関数はデータの読み書きも参照のこと。
変数をつくる・消す †
逐一変数を定義しなくて良いところがNCLの良いところだが必要になることもある。
また,すでに使った変数をもう一度使いたいが型や次元が違う場合には,:= で代入し直すか,deleteで一度定義された変数を消さなくてはならない。使わない場合でも,メモリーを気にするなら,使わなくなった大きな配列はこまめに消すとよい。
すでに定義されている関数名をどうしても変数名として使いたい時,自分で関数を定義する際に別のすでに定義されている関数名と被ってしまう時には,すでに定義されているものを無効化することもできる。
- undef
定義されている関数やprocedureを無効にする。
等間隔の値が入った配列を作りたい場合には以下の関数が使える。
- fspan
等間隔の並んだ浮動小数点数の配列をつくる
変数の情報を得る †
変数の中身を知る(コマンドライン等に表示する)場合には,次の2つのprocedureが使える。
- print
変数や式の結果の値や情報を表示するprocedure
- printVarSummary
変数名,型,次元,座標,Attributesなど,変数についての情報を表示するprocedure。値は必要なく,様々な情報だけで良いときにはこちらを使う。
例えば,
test = (/ (/7,10/), (/8,5/), (/4,11/) /)
test!0 = "dim_0"
test!1 = "dim_1"
test&dim_0 = (/0,1,2/)
test&dim_1 = (/"apple","banana"/)
test@unit = "cm"
test@_FillValue = -999
print(test)
printVarSummary(test)
とすると,printの結果として,
Variable: test
Type: integer
Total Size: 24 bytes
6 values
Number of Dimensions: 2
Dimensions and sizes: [dim_0 | 3] x [dim_1 | 2]
Coordinates:
dim_0: [0..2]
dim_1: [apple..banana]
Number Of Attributes: 2
_FillValue : -999
unit : cm
(0,0) 7
(0,1) 10
(1,0) 8
(1,1) 5
(2,0) 4
(2,1) 11
が得られ,printVarSummaryの結果として,
Variable: test
Type: integer
Total Size: 24 bytes
6 values
Number of Dimensions: 2
Dimensions and sizes: [dim_0 | 3] x [dim_1 | 2]
Coordinates:
dim_0: [0..2]
dim_1: [apple..banana]
Number Of Attributes: 2
_FillValue : -999
unit : cm
が得られる。printVarSummaryをスクリプトの途中にはさむとデバッグに便利である。
また,変数についての情報を別の変数として得る関数もある。例えば,
- typeof
変数の型を得る関数。上の例で typetest = typeof(test) とすると,typetestには "integer" が入る。
- dimsizes
変数の各次元の大きさが入った1次元配列を得る。上の例で dimtest = dimsizes(test) とすると,dimtestには (/3, 2/) が入る。
dimsizesを2回入れ子にして使うと配列の次元数が求まることになる。
- sizeof
変数のサイズ(メモリを占めている容量)をバイト単位で返す関数。
配列の変形・結合 †
例えば,緯度×経度([90]x[360])の配列xがあり,それを高さ方向を加えた3次元([17]x[90]x[360])に拡張し,全ての高さについて同じ値で埋めたいとすると,
y = conform_dims((/17,90,360/),x,(/1,2/))
とすればいい。yは[17]x[90]x[360]の配列であり,任意のkに対してy(k,:,:)はxと等しい。
例えば,x1が[12]x[90]x[360]の配列,x2が[12]x[90]x[360]の配列のとき,
y = array_append_record(x1,x2,0)
とすると,yは[24]x[90]x[360]の配列となり,y(0:11,:,:)がx1と等しく,y(12:23,:,:)がx2と等しい。
型変換 †
変数の型を変換する関数を一部だけ紹介する。型に関しては変数の型も参照のこと。
ほかにも型変換の関数はたくさんある。
内挿や座標変換 †
- lonFlip
経度座標の始点を日付変更線からグリニッジ子午線へ入れ替える(またはその逆を行う)関数
- linint2
2次元の線形内挿を配列の最も右の二つの次元について行う関数
- f2fsh
スカラー量を球面調和関数展開を用いて,等間隔の緯度経度グリッドから別の等間隔の緯度経度グリッドへ変換する関数。
- g2fsh
スカラー量を球面調和関数展開を用いて,ガウス格子から等間隔の緯度経度グリッドへ変換する関数。
- f2gsh
スカラー量を球面調和関数展開を用いて,等間隔の緯度経度グリッドからガウス格子へ変換する関数。
- g2gsh
スカラー量を球面調和関数展開を用いて,ガウス格子から別のガウス格子へ変換する関数。
- csa2
2次元上にランダムに分布した点における値を,3次スプライン補間を用いてグリッドデータにする関数
- csa2l
2次元上にランダムに分布した点における値を,3次スプライン補間を用いて別のランダムに分布した点上のデータにする関数
- csa3
3次元上にランダムに分布した点における値を,3次スプライン補間を用いてグリッドデータにする関数
- csa3l
3次元上にランダムに分布した点における値を,3次スプライン補間を用いて別のランダムに分布した点上のデータにする関数
- hyi2hyo
(圧力座標やシグマ座標を含む)ハイブリッド座標から別のハイブリッド座標への変換を行う
座標やattsのコピー †
文字列操作 †
- sprintf
float型やdouble型の変数を定められた書式の文字列にする関数。
- str_split
一つの文字列をあるデリミタ(区切り文字)に基づいて分割する関数。連続するデリミタは一つとみなす。
- str_split_csv
一つまたは複数の文字列をあるデリミタ(区切り文字)に基づいて分割する関数。連続するデリミタはそれぞれ別のデリミタとみなす。
- str_join
複数の文字列をあるデリミタ(区切り文字)で区切られた一つの文字列に結合する関数。
マスクアウトなど †
- where
条件に基づいて配列の中身を変える関数。汎用性が高い。
- mask
条件に基づいて配列の一部を未定義値にする関数。
並べ替え †
- qsort
数値型の配列を昇順に並べ替えるprocedure。
- sqsort
文字列型の配列を昇順に並び替えるprocedure。
最大最小・計数・論理 †
- min
最も単純な最小値を求める関数。配列の次元に関わらずすべての要素の最小値を計算する。
- max
最も単純な最大値を求める関数。配列の次元に関わらずすべての要素の最大値を計算する。
- dim_num
論理型配列の最も右の次元についてTrueを数える関数。
- any
論理型配列のどこかにTrueがあればTrueを返す関数。
- all
論理型配列がすべてTrueであればTrueを返す関数。
- ind
ある1次元配列においてある条件を満たす要素のインデックスを返す関数。入力変数には変数よりは,論理式そのものを入れて使うことが多いかもしれない。
例えば,
x = (/-1.0, 2.0, 4.0, -5.0/)
のとき,
id = ind(x.gt.0) ; x.gt.0 が (/ False, True, True, False /)であるから,
id = (/1,2/)となる。
また,
x = (/12.22, -5.93, -999., 3.01, -0.22/)
x@_FillValue = -999.
のとき,
id = ind(.not.ismissing(x)) ; id = (/0, 1, 3, 4/)
- ismissing
変数中の各要素について未定義値かどうかを返す。例えば,
a = (/1,2,3,-999,5/)
a@_FillValue = -999
print(ismissing(a))
のとき,(/False, False, False, True, False/)を得る。
また,他の関数を組み合わせて使うと便利である。例えば,
if(all(ismissing(data))) then
print("Your data is all missing.")
end if
とか,
if(any(ismissing(data))) then
print("Your data contains some missing values. Beware.")
end if
とか,num(.not.ismissing(data))で未定義値を除いた要素数が得られるとか。
- isatt
変数にAttributeが定義されているかどうかを返す。
- isdefined
変数や関数,procedureが定義されているかどうかを返す。
使い方の例としては,実行時にコマンドラインを通して変数を与える場合に,与えられなかったときの値を設定しておくことができる。ここではhoge.ncl中のseasonという変数を考える。hoge.nclの内部で
if (.not.isdefined("season")) then
season = "DJF"
end if
としておくと,実行時に
$ ncl 'season="SON"' hoge.ncl
のように別の値を与えることができ,
$ ncl hoge.ncl
のように何も与えなかった場合には,season="DJF"となる。
時間に関する関数 †
- cd_calendar
時間の配列をカレンダーでの表現に近い値に変換する関数。
時間はある時点からの日数や時間などで表されることが多いが,それを何年何月何日のような値に変換する。
- day_of_year
グレゴリオ暦の年,月,日の配列から,その年の何日目であるか(the day of the year)を計算する関数
- monthday
年とその年の何日目であるか(the day of the year)から,日付を計算する関数
シェルコマンドの実行 †