ここでは変数操作に関する関数などについて紹介します。
具体的な解析というよりも,解析する上で便利な変数・配列に対する操作について書かれます。
データIOに関連する関数はデータの読み書きも参照のこと。
逐一変数を定義しなくて良いところがNCLの良いところだが必要になることもある。
新しい変数をつくる。
また,すでに使った変数をもう一度使いたいが型や次元が違う場合には,:= で代入し直すか,deleteで一度定義された変数を消さなくてはならない。使わない場合でも,メモリーを気にするなら,使わなくなった大きな配列はこまめに消すとよい。
変数を消す。
すでに定義されている関数名をどうしても変数名として使いたい時,自分で関数を定義する際に別のすでに定義されている関数名と被ってしまう時には,すでに定義されているものを無効化することもできる。
定義されている関数やprocedureを無効にする。
等間隔の値が入った配列を作りたい場合には以下の関数が使える。
等間隔に並んだ整数の配列をつくる
等間隔の並んだ浮動小数点数の配列をつくる
変数の中身を知る(コマンドライン等に表示する)場合には,次の2つのprocedureが使える。
変数や式の結果の値や情報を表示するprocedure
変数名,型,次元,座標,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をスクリプトの途中にはさむとデバッグに便利である。
また,変数についての情報を別の変数として得る関数もある。例えば,
変数の各次元の大きさが入った1次元配列を得る。上の例で dimtest = dimsizes(test) とすると,dimtestには (/3, 2/) が入る。
dimsizesを2回入れ子にして使うと配列の次元数が求まることになる。
変数のサイズ(メモリを占めている容量)をバイト単位で返す関数。
配列の形を変える(要素数は同じで形を変える)
配列の次元を広げる(次元を増やし,新しい次元については全て同一の値で埋める)
例えば,緯度×経度([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と等しい。
多次元配列を1次元配列に変形する
1次元配列を多次元配列に変形する
二つの配列をつなげる。
例えば,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と等しい。
変数の型を変換する関数を一部だけ紹介する。型に関しては変数の型も参照のこと。
整数型に変換
文字列型に変換
float型に変換
scaleやoffsetをもつshort型の変数をfloat型に変換
ほかにも型変換の関数はたくさんある。
経度座標の始点を日付変更線からグリニッジ子午線へ入れ替える(またはその逆を行う)関数
1次元の線形内挿を配列の最も右の次元について行う関数
2次元の線形内挿を配列の最も右の二つの次元について行う関数
スプライン補間を行う関数
スプライン補間を行い微分値を計算する関数
スプライン補間を行い積分値を計算する関数
スカラー量を球面調和関数展開を用いて,等間隔の緯度経度グリッドから別の等間隔の緯度経度グリッドへ変換する関数。
スカラー量を球面調和関数展開を用いて,ガウス格子から等間隔の緯度経度グリッドへ変換する関数。
スカラー量を球面調和関数展開を用いて,等間隔の緯度経度グリッドからガウス格子へ変換する関数。
スカラー量を球面調和関数展開を用いて,ガウス格子から別のガウス格子へ変換する関数。
あるグリッドから別のグリッドへ面積積分値を保存するように変換する関数。
2次元上にランダムに分布した点における値を,3次スプライン補間を用いてグリッドデータにする関数
2次元上にランダムに分布した点における値を,3次スプライン補間を用いて別のランダムに分布した点上のデータにする関数
3次元上にランダムに分布した点における値を,3次スプライン補間を用いてグリッドデータにする関数
3次元上にランダムに分布した点における値を,3次スプライン補間を用いて別のランダムに分布した点上のデータにする関数
鉛直座標をあるp座標から別のp座標に変換する関数。
(圧力座標やシグマ座標を含む)ハイブリッド座標から別のハイブリッド座標への変換を行う
ある変数から別の変数へattributeをコピーするprocedure
ある変数から別の変数へ次元の名前やそれらに対応する座標をコピーするprocedure
ある変数から別の変数へメタデータをコピーするprocedure
整数を定められた書式の文字列にする関数。
float型やdouble型の変数を定められた書式の文字列にする関数。
一つの文字列をあるデリミタ(区切り文字)に基づいて分割する関数。連続するデリミタは一つとみなす。
一つまたは複数の文字列をあるデリミタ(区切り文字)に基づいて分割する関数。連続するデリミタはそれぞれ別のデリミタとみなす。
一つまたは複数の文字列を指定した文字数ごとに区切った配列に変換する関数。
複数の文字列を一つの文字列に結合する関数。
複数の文字列をあるデリミタ(区切り文字)で区切られた一つの文字列に結合する関数。
一つまたは複数の文字列を部分的に置換する関数。
条件に基づいて配列の中身を変える関数。汎用性が高い。
条件に基づいて配列の一部を未定義値にする関数。
数値型の配列を昇順に並べ替えるprocedure。
文字列型の配列を昇順に並び替えるprocedure。
配列の最も右の次元について置換ベクトルを返し,必要なら並び替える関数。
配列の指定した次元について置換ベクトルを返し,必要なら並び替える関数。
最も単純な最小値を求める関数。配列の次元に関わらずすべての要素の最小値を計算する。
最小値を取る要素のインデックスを返す関数。
配列の最も右の次元についての最小値を求める関数。
配列の指定した次元についての最小値を求める関数。
最も単純な最大値を求める関数。配列の次元に関わらずすべての要素の最大値を計算する。
最大値を取る要素のインデックスを返す関数。
配列の最も右の次元についての最大値を求める関数。
配列の指定した次元についての最大値を求める関数。
論理型配列のTrueを数える関数。
論理型配列の最も右の次元についてTrueを数える関数。
論理型配列の指定した次元についてTrueを数える関数。
論理型配列のどこかにTrueがあればTrueを返す関数。
論理型配列がすべてTrueであればTrueを返す関数。
ある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/)
indで得られるようなインデックスの1次元配列を多次元の表現に変える関数。ndtoonedなどと組み合わせて使うことが多いだろう。
変数中の各要素について未定義値かどうかを返す。例えば,
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
変数が定義されているかどうかを返す。
変数にAttributeが定義されているかどうかを返す。
変数や関数,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"となる。
指定したファイルが存在するかどうかを返す関数。
指定したファイルがaddfileで扱えるものとして存在するかどうかを返す関数。
時間の配列をカレンダーでの表現に近い値に変換する関数。
時間はある時点からの日数や時間などで表されることが多いが,それを何年何月何日のような値に変換する。
cd_calendarの逆を行う関数。何年何月何日のようなカレンダー的な値から,ある時点からの日数や時間のような値に変換する。
閏年かどうかを調べる関数
グレゴリオ暦の年,月,日の配列から,その年の何日目であるか(the day of the year)を計算する関数
年と月から,その月が何日あるか計算する関数
年とその年の何日目であるか(the day of the year)から,日付を計算する関数
YYYYMMの配列から,その年内における割合を計算する関数
YYYYMMDDの配列から,その年内における割合を計算する関数
YYYYMMDDHHの配列から,その年内における割合を計算する関数
YYYYMMの配列を作る関数
YYYYMMDDの配列を作る関数
YYYYMMDDHHの配列を作る関数
シェルコマンドを実行するprocedure
シェルコマンドを実行し,標準出力を文字列として得る関数
NCLスクリプト内で別の複数のサブプロセスを並列実行する関数。subprocess_waitと組み合わせて使うと便利。
スクリプト例:アニメーションの作成(サブプロセス並列実行の活用)も参照