[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:000217] NumArray prototype in ruby
堀之内です。
NumArray の ruby によるプロトタイプの試作品(長い..)を作ってみ
ました。
ftp://dennou-t.ms.u-tokyo.ac.jp/arch/davis/ex/2000-02-06-horinout/
以下の num_array-20000206.tar またはその展開ファイル num_array/ です。
使用法は numarray.rb の最後のテスト部分を参照してください。実行は
% ruby numarray.rb
です。
今回作ったものは、かつて NMDArray と称して作ったものと基本的に同
じですが、若干ちがいます:
#0. 名前
一次元配列 BasicNumArray
多次元配列 NumArray
#1. クラス構成
サブセット等をとるときに必要な「配列の添字」をクラス ArrayIndex
として独立させました。詳しくは README_arrayindex を参照。
#2. マスキング
インデックスとして true と false(またはnil) からなる「論理型」配
列を取れるようにしました。trueのところだけ取り出したり([]メソッ
ドで)、書き込んだり([]=メソッドで)するためです。よって
BasicNumArray でも論理型に対応するものが欲しいです。要は true と
false が区別できればいいので実体は整数でも構いませんが、もったい
ないのでバイト型が欲しいです > ごとけんさん。ちなみに配列が論理
型かどうかはメソッド logical? が true を返す(正確には flaseまた
はnil以外を返す)かどうかで判定しています。で、mask の要素が
false/nil 以外のインデックスを選択します(要するに各要素に if を
適用して判別している)。
マスキングの主な用途として配列の要素毎の if を想定しています。
Fortran90なら where 構文で行うことに相当します。このため比較演算
メソッド le (=less or equal), gt (=greater than) 等を定義し、マ
スクを返すようにしています。例えば
a[a.le(0.0)] = 0.0
は配列 a の負の値をゼロにします。これは
mask = a.le(0.0) ; a[mask] = 0.0
と同等です。メソッドのカッコは省略できますので、a[a.le 0.0]=0.0
とも書けます。また and, or 演算メソッドはそれぞれ and_ と or_ で
す(アンダースコアに注意)。"le" 等の代りに演算子 "<=" 等を再定義す
ることも考えられますが、&&,||,and,or は再定義できません。<= を許
すと必ず (a <= b) && (b <= c) と書くバグに悩まされますから、しな
いほうがいいです。
マスキングは各次元に関しても適用できます。例えばこんな感じ:
u_NH_average = u_wind[ true , lat.gt 0 ].average
(averageは未実装です。インデックスの true は 0..-1 と同じで全選
択。)
#3. NMDArray のいくつかの機能 (transposeとか次元拡張と平均とか)
は未実装。
堀之内 武 horinout@xxxxxx
京都大学超高層電波研究センター 611-0011 宇治市五ヶ庄
phone:0774-38-3812 fax:0774-31-8463