[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:002026] Re: gphys-0.3.5 released



堀之内です。


>       newgp = self.copy[false, [0...vx.length, 0], *([true]*(rank-1-dim))]
>                                ^^^^^^^^^^^^^^^^^^

に疑問に思うひとのために。。。
(持たなければ気にしないでください)

こちらの copy は、本来はいらないのですが、実はどうも恐らく
NetCDFVar の [ ] に問題があって、欠損値がある場合にうまく行かな
いのを避けるようにしてます。対象を指定せず copy するとメモリーに
読み込まれますので NetCDF ファイルから離れられます。

● これだけではナンなので、Ruby tip。

dim 番目の次元という指定のし方を紹介します。微分など、とあ
る次元に対して適用する処理を実装するのはどうすればいいかと
いう話です。

以下、a は NArray, VArray, GPhys などだとします。dim次元目の i 
番目の要素を切り出したい場合(dim も i もゼロが始まりです。)
以下のようにします。

   sub = a[false, i, *([true]*(a.rank-1-dim))]   # 上記のやり方

   sub = a[ *( [true]*dim+[i, false] ) ]   # もうちょっとわかり易いやり方

いずれも、Array どうしの足し算は両辺をくっつけ、掛け算は個数分の
繰り返しであること、そして最後の引数が * のついた配列である場合、
その中身を展開することを利用してます。よって、後者における 
[true]*dim+[i, false] は

  [ true, true, .., true, i, false ]
    ^^^^^trueがdim個^^^^

となりますので、2番目のは

   sub = a[ *( [true, true, .., true, i, false] ) ]
                ^^^^^trueがdim個^^^^

即ち

   sub = a[ true, true, .., true, i, false ]
            ^^^^^trueがdim個^^^^

になります。で、false は任意個の true を表す「rubber(ゴム)次元」
なので、初期の目的が果たせるという具合い。false の用法は NArray 
等に特有な話ですが、それ以外は Ruby 自身の話です。なお、falseを
使わず次のようにもできます。

   sub = a[ *( [true]*dim+[i]+[true]*(a.rank-dim-1) ) ]

でも同じです。