[ GFD Dennou Ruby Home | GPhys Home | Tutorial top ]

GPhys, GGraphチュートリアル (その5)

NArray を使った配列演算*

多次元数値配列クラス NArray を使った配列演算を体験します. これを使うと,大量の数値を扱う計算が Ruby 上で簡単かつ高速にできるようになります. NArray は GPhys の重要な基礎部分です. NArray と GPhys とは,配列としては同じ構造をもっています. NArray に座標という概念や属性,名前といった要素を加えて拡張したものが GPhys だといえます.

目次

使い方

Ruby という言語 で見たように,Ruby に標準装備されている配列 (Array) は,オブジェクトを順番に並べたものであり,これもまた1つのオブジェクトでした. 配列の要素は同じ型である必要はなく任意のオブジェクトを格納できるという柔軟なものなので,その分計算速度は犠牲になっています. そこでわれわれが数値計算をするときには NArray というクラスパッケージを用いることにします.

NArray クラスを用いるには,まず,

require "narray"

としましょう.これで NArray クラスの定義が読み込まれます.

新たに配列を生成する(つまり NArray クラスのオブジェクトを新たに生成する)には, NArray.new("型",大きさ,大きさ,...) とします. が,通常はそれより簡単な NArray.型(大きさ,大きさ,...) を用います. たとえば 3x4 の単精度実数配列 ary1 を作るには,

ary1 = NArray.sfloat(3,4)

です. これだけでは中身の値はすべて0です. 次にこの配列オブジェクトに中身をセットするメソッドを作用させます.

ary2 = NArray.sfloat(6).fill(3.0)   # 長さ 6 の配列で,中身はすべて 3.0
ary3 = NArray.sfloat(10).indgen!     # 1 ずつ増やした値をセットする

また、Array と NArray の間で型変換するには,

irb(main):005:0> ary4 = [ 2, 3, 4.5, 8 ]             # 通常の配列
ary5 = NArray.to_na(ary4)           # ary4 を NArray に変換
ary6 = ary5.to_a                    # ary5 を Array に変換

とします. NArray では,例えば中に1つでも実数が含まれていれば実数の配列となり,要素はすべて実数になります.

要素番号

インデックスは Array や C言語と同じで,最初の要素番号は0,最後の要素番号は 要素数-1 です. 多次元のインデックスの順序は FORTRAN と同じで,前の要素から数字を増やします.

ary7 = NArray.sfloat(4,3).indgen!
ary7[0,0]           # 最初の要素
ary7[1,0]           # 次の要素
ary7[1..2,0..-1]    # 範囲取り出し
ary7[true,1]        # trueは 0..-1 と同じ
ary7[0..1,0] = 999  # 値の代入
ary7

演算

演算は要素ごとにやってくれます. 同じ演算子であっても Array の場合と動作が違うことに注意してください.

ary8 = NArray.sfloat(4,3).fill!(3.0)
ary7 + ary8
ary7 * ary8
ary7 % ary8
ary7 - 1.5
ary7 ** 2

いろいろなメソッド

NArray クラスには,平均・標準偏差などの統計計算や要素の並べかえなど,いろいろなメソッドが用意されています. NArrayのメソッド一覧 を参照しながら,以下の演習問題をやってみましょう.

演習問題

笑介くんのクラス20人のテストの点数は,理科が

65, 80, 67, 35, 58, 60, 72, 75, 68, 92, 36, 50, 2, 58.5, 46, 42, 78, 62, 84, 70

英語が

44, 87, 100, 63, 52, 60, 58, 73, 55, 86, 29, 56, 89, 23, 65, 84, 64, 27, 86, 84

でした. クラス全体での平均点,標準偏差を教科別に求めなさい. また,理科・英語の合計点について,各人の偏差値を求めなさい.

この章で引用した資料

[次へ進む]


davis Group / GFD Dennou Staff dcstaff@gfd-dennou.org