変数操作など - NCL tips

ここでは変数操作に関する関数などについて紹介します。
具体的な解析というよりも,解析する上で便利な変数・配列に対する操作について書かれます。
データIOに関連する関数はデータの読み書きも参照のこと。


変数をつくる・消す

逐一変数を定義しなくて良いところがNCLの良いところだが必要になることもある。

  • new

    新しい変数をつくる。


また,すでに使った変数をもう一度使いたいが型や次元が違う場合には,:= で代入し直すか,deleteで一度定義された変数を消さなくてはならない。使わない場合でも,メモリーを気にするなら,使わなくなった大きな配列はこまめに消すとよい。


すでに定義されている関数名をどうしても変数名として使いたい時,自分で関数を定義する際に別のすでに定義されている関数名と被ってしまう時には,すでに定義されているものを無効化することもできる。

  • undef

    定義されている関数やprocedureを無効にする。


等間隔の値が入った配列を作りたい場合には以下の関数が使える。

  • ispan

    等間隔に並んだ整数の配列をつくる

  • 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

    変数のサイズ(メモリを占めている容量)をバイト単位で返す関数。


配列の変形・結合

  • reshape

    配列の形を変える(要素数は同じで形を変える)

  • conform_dims

    配列の次元を広げる(次元を増やし,新しい次元については全て同一の値で埋める)


例えば,緯度×経度([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と等しい。

  • ndtooned

    多次元配列を1次元配列に変形する

  • onedtond

    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と等しい。


型変換

変数の型を変換する関数を一部だけ紹介する。型に関しては変数の型も参照のこと。

  • short2flt

    scaleやoffsetをもつshort型の変数をfloat型に変換


ほかにも型変換の関数はたくさんある。


内挿や座標変換

  • lonFlip

    経度座標の始点を日付変更線からグリニッジ子午線へ入れ替える(またはその逆を行う)関数

  • linint1

    1次元の線形内挿を配列の最も右の次元について行う関数

  • linint2

    2次元の線形内挿を配列の最も右の二つの次元について行う関数

  • ftcurv

    スプライン補間を行う関数

  • ftcurvd

    スプライン補間を行い微分値を計算する関数

  • ftcurvi

    スプライン補間を行い積分値を計算する関数

  • f2fsh

    スカラー量を球面調和関数展開を用いて,等間隔の緯度経度グリッドから別の等間隔の緯度経度グリッドへ変換する関数。

  • g2fsh

    スカラー量を球面調和関数展開を用いて,ガウス格子から等間隔の緯度経度グリッドへ変換する関数。

  • f2gsh

    スカラー量を球面調和関数展開を用いて,等間隔の緯度経度グリッドからガウス格子へ変換する関数。

  • g2gsh

    スカラー量を球面調和関数展開を用いて,ガウス格子から別のガウス格子へ変換する関数。

  • area_conserve_remap

    あるグリッドから別のグリッドへ面積積分値を保存するように変換する関数。

  • csa2

    2次元上にランダムに分布した点における値を,3次スプライン補間を用いてグリッドデータにする関数

  • csa2x

    重み付け,微分値,データが疎な領域の扱いに対応したcsa2の拡張版

  • csa2l

    2次元上にランダムに分布した点における値を,3次スプライン補間を用いて別のランダムに分布した点上のデータにする関数

  • csa3

    3次元上にランダムに分布した点における値を,3次スプライン補間を用いてグリッドデータにする関数

  • csa3x

    重み付け,微分値,データが疎な領域の扱いに対応したcsa3の拡張版

  • csa3l

    3次元上にランダムに分布した点における値を,3次スプライン補間を用いて別のランダムに分布した点上のデータにする関数

  • int2p_n

    鉛直座標をあるp座標から別のp座標に変換する関数。

  • hyi2hyo

    (圧力座標やシグマ座標を含む)ハイブリッド座標から別のハイブリッド座標への変換を行う


座標やattsのコピー

  • copy_VarAtts

    ある変数から別の変数へattributeをコピーするprocedure

  • copy_VarCoords

    ある変数から別の変数へ次元の名前やそれらに対応する座標をコピーするprocedure

  • copy_VarMeta

    ある変数から別の変数へメタデータをコピーするprocedure


文字列操作

  • sprinti

    整数を定められた書式の文字列にする関数。

  • sprintf

    float型やdouble型の変数を定められた書式の文字列にする関数。

  • str_split

    一つの文字列をあるデリミタ(区切り文字)に基づいて分割する関数。連続するデリミタは一つとみなす。

  • str_split_csv

    一つまたは複数の文字列をあるデリミタ(区切り文字)に基づいて分割する関数。連続するデリミタはそれぞれ別のデリミタとみなす。

  • str_split_by_length

    一つまたは複数の文字列を指定した文字数ごとに区切った配列に変換する関数。

  • str_concat

    複数の文字列を一つの文字列に結合する関数。

  • str_join

    複数の文字列をあるデリミタ(区切り文字)で区切られた一つの文字列に結合する関数。

  • str_sub_str

    一つまたは複数の文字列を部分的に置換する関数。


マスクアウトなど

  • where

    条件に基づいて配列の中身を変える関数。汎用性が高い。

  • mask

    条件に基づいて配列の一部を未定義値にする関数。


並べ替え

  • qsort

    数値型の配列を昇順に並べ替えるprocedure。

  • sqsort

    文字列型の配列を昇順に並び替えるprocedure。

  • dim_pqsort

    配列の最も右の次元について置換ベクトルを返し,必要なら並び替える関数。

  • dim_pqsort_n

    配列の指定した次元について置換ベクトルを返し,必要なら並び替える関数。


最大最小・計数・論理

  • min

    最も単純な最小値を求める関数。配列の次元に関わらずすべての要素の最小値を計算する。

  • minind

    最小値を取る要素のインデックスを返す関数。

  • dim_min

    配列の最も右の次元についての最小値を求める関数。

  • dim_min_n

    配列の指定した次元についての最小値を求める関数。

  • max

    最も単純な最大値を求める関数。配列の次元に関わらずすべての要素の最大値を計算する。

  • maxind

    最大値を取る要素のインデックスを返す関数。

  • dim_max

    配列の最も右の次元についての最大値を求める関数。

  • dim_max_n

    配列の指定した次元についての最大値を求める関数。

  • num

    論理型配列のTrueを数える関数。

  • dim_num

    論理型配列の最も右の次元についてTrueを数える関数。

  • dim_num_n

    論理型配列の指定した次元について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/)


  • ind_resolve

    indで得られるようなインデックスの1次元配列を多次元の表現に変える関数。ndtoonedなどと組み合わせて使うことが多いだろう。

  • 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))で未定義値を除いた要素数が得られるとか。

  • isvar

    変数が定義されているかどうかを返す。

  • 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"となる。


  • fileexists

    指定したファイルが存在するかどうかを返す関数。

  • isfilepresent

    指定したファイルがaddfileで扱えるものとして存在するかどうかを返す関数。


時間に関する関数

  • cd_calendar

    時間の配列をカレンダーでの表現に近い値に変換する関数。
    時間はある時点からの日数や時間などで表されることが多いが,それを何年何月何日のような値に変換する。

  • cd_inv_calendar

    cd_calendarの逆を行う関数。何年何月何日のようなカレンダー的な値から,ある時点からの日数や時間のような値に変換する。

  • day_of_year

    グレゴリオ暦の年,月,日の配列から,その年の何日目であるか(the day of the year)を計算する関数

  • days_in_month

    年と月から,その月が何日あるか計算する関数

  • monthday

    年とその年の何日目であるか(the day of the year)から,日付を計算する関数

  • yyyymm_to_yyyyfrac

    YYYYMMの配列から,その年内における割合を計算する関数


シェルコマンドの実行

  • system

    シェルコマンドを実行するprocedure

  • systemfunc

    シェルコマンドを実行し,標準出力を文字列として得る関数


トップ   編集 凍結 添付 名前変更   新規