[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:002026] Re: gphys-0.3.5 released
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:002026] Re: gphys-0.3.5 released
- From: Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxxx>
- Date: Mon, 17 Jan 2005 19:41:33 +0900
堀之内です。
> 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) ) ]
でも同じです。