この文章は NArray<URL:http://narray.rubyforge.org/index.html.en> の日本語による解説文章です.

この文章を書いたのは大林一平です.

<URL:https://bitbucket.org/ohai/narray-doc/> に元データが置いてあります. issue trackerがあるので要望等あれば書いてください.

class NArray

数値データの(巨大)な配列を表現するクラス.

データの型としては

が使えます(最後のは数値ではありませんが…).

配列の構造として任意の次元の配列が使えます. 実際には1次元もしくは2次元の配列が良く使われます. 配列の次元は NArray#dim, 配列の要素数は NArray#shape で 得られます.

ベクトルと行列

NArray のサブクラスとして NVector, NMatrix があり, 1次元の配列を NVector でベクトルとして, 2次元の配列を NMatrix で行列として扱うことができます.

# 行列をベクトルに作用させる例
v = NVector[1.0, 2.0]
m = NMatrix[[1.0, 2.0], [3.0, 4.0]]
p m*v
# => NVector.float(2): 
# [ 5.0, 11.0 ]

NArrayオブジェクトの生成

NArrayオブジェクトの生成には

などがあります.

を使うと良いでしょう.

p NArray.float(3, 3) 
# => NArray.float(3,3): 
# [ [ 0.0, 0.0, 0.0 ], 
#   [ 0.0, 0.0, 0.0 ], 
#   [ 0.0, 0.0, 0.0 ] ]  
p NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
ary = [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
p NArray.to_na(ary)
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]

クラス名をNArrayからNVectorやNMatrixに変えることで ベクトルや行列を同様に生成できます.

インデックス参照

NArrayの配列をインデックスで指定する方法は非常に多彩です. トラップも多いので注意が必要です.

インデックスの順序は「FORTRAN型」と呼ばれるものです. 以下に示すように,Rubyの方式とは順序が逆なので注意が必要です. インデックスは 0 originです.

a = NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
p a[2,0] 
# => 3.0

負数は末尾から数えます

p => a[-1, 0] # a[2, 0] と同じ
# => 3.0

Rangeを使うことで部分配列を取り出すことができます.

p a[0..1, 1..2] # 左下の2x2の部分配列
# => NArray.float(2,2): 
# [ [ 4.0, 5.0 ], 
#   [ 7.0, 8.0 ] ]

Rangeを使うと 1x1 の NArray が作れます

a[1..1, 1..1]
#  => NArray.float(1,1): 
# [ [ 5.0 ] ]

trueを指定することで Range で 0..末尾 を指定したのと同じになります. 行列で特定の行や列を取り出す場合などに用います.

p a[2, true]
# => NArray.float(3): 
# [ 3.0, 6.0, 9.0 ]
p a[true, 2]
# => NArray.float(3): 
# [ 7.0, 8.0, 9.0 ]

インデックスに要素を1つだけ指定すると,配列を1次元と見なしたもので参照されます.

a[5] # a[2,1]
# => 6.0
a[5..6] # [a[2,1], a[3,0]]
# => NArray.float(2): 
# [ 6.0, 7.0 ]

byte型のNArrayは真偽値と見なして配列をマスクすることができます. 値が1の部分を取り出して1次元化した配列(NArray)を返します.

mask = a > 4.5
p mask
# => NArray.byte(3,3): 
# [ [ 0, 0, 0 ], 
#   [ 0, 1, 1 ], 
#   [ 1, 1, 1 ] ]
a[mask]
# => NArray.float(5): 
# [ 5.0, 6.0, 7.0, 8.0, 9.0 ]

インデックスのNArrayを使って部分配列を取り出すことができます.

a = NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
indices = (a > 4.5).where
p indices 
# => NArray.int(5): 
# [ 4, 5, 6, 7, 8 ]
p a[indices] 
# => NArray.float(5): 
# [ 5.0, 6.0, 7.0, 8.0, 9.0 ]

インデックス配列は特定の次元に適用することもできます. 以下の例では1列目の要素が負であるような列のみを取り出しています.

u = NArray[[1.0, -2.0, 3.0], [-4.0, 5.0, -6.0], [7.0, -8.0, 9.0]]
p u[1, true] # 真ん中の列を取り出す
# => NArray.float(3): 
# [ -2.0, 5.0, -8.0 ]
indices = (u[1, true] < 0.0).where 
# => NArray.int(2): 
# [ 0, 2 ]
p u[true, indices] # 0行目と2行目を取り出した配列を作る
# => NArray.float(3,2): 
# [ [ 1.0, -2.0, 3.0 ], 
#   [ 7.0, -8.0, 9.0 ] ]

NArray#slice でも NArray#[] と同じような動作をしますが, 次元を落としません.

p a.slice(1, 1)
# => NArray.float(1,1):
# [ [ 5.0 ] ]

代入

NArrayは普通の配列のように代入できます.

a = NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
a[2,0]  = 10.0 # 右上の要素を変更
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 10.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]

範囲指定を用いて配列の一部を別の配列で変更することもできます.

a = NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
b = NArray[[10.0, 11.0], [12.0, 13.0]]
p b
# => NArray.float(2,2): 
# [ [ 10.0, 11.0 ], 
#   [ 12.0, 13.0 ] ]
a[0..1, 1..2] = b
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 10.0, 11.0, 6.0 ], 
#   [ 12.0, 13.0, 9.0 ] ]

trueを用いた範囲指定でも同様のことができます. 行列の行や列を変更するために使えます.

a = NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
a[true, 1] = NArray[10.0, 11.0, 12.0]
p a 
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 10.0, 11.0, 12.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
a[1, true] = NArray[13.0, 14.0, 15.0]
p a
# => NArray.float(3,3): 
# [ [ 1.0, 13.0, 3.0 ], 
#   [ 10.0, 14.0, 12.0 ], 
#   [ 7.0, 15.0, 9.0 ] ]

範囲指定による代入の右辺をスカラー値にすると, その値で埋められます.

a = NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
a[0..1, 1..2] = 10.0
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 10.0, 10.0, 6.0 ], 
#   [ 10.0, 10.0, 9.0 ] ]

複素数について

複素数は Ruby 組み込みの Complex クラスと相互に運用できます.

例えば NArray.[] や NArray.to_na で複素数のNArrayが生成できます.

p NArray[Complex(1.0, 2.0), Complex(3.0, 4.0)]
# => NArray.complex(2): 
# [ 1.0+2.0i, 3.0+4.0i ]

複素数のNArrayに対するインデックス代入の右辺に実数を用いると, 虚数成分には0が代入されます.

a = NArray[Complex(1.0, 2.0), Complex(3.0, 4.0)]
a[true] = NArray[1.0, 2.0]
# => NArray.complex(2): 
# [ 1.0+0.0i, 2.0+0.0i ]

NArray.imag= を用いると,虚数成分だけを変更することができます.

a = NArray[Complex(1.0, 2.0), Complex(3.0, 4.0)]
a.imag = NArray[5.0, 6.0]
p a
# => NArray.complex(2): 
# [ 1.0+5.0i, 3.0+6.0i ]

これらの機能を用いて,例えば実数型NArrayのペアから複素数型のNArrayを 作ることなどができます.

a = NArray.complex(3)
a[] = NArray[1.0, 2.0, 3.0]
a.imag = NArray[4.0, 5.0, 6.0]
p a
# => NArray.complex(3): 
# [ 1.0+4.0i, 2.0+5.0i, 3.0+6.0i ]

演算

NArrayに対する演算は配列の対応する各要素ごとに行われます.例えば NArray#* は行列の積ではなく,各要素ごとの積を計算します.

a = NArray.float(3, 3); a.indgen!(1.0, 1.0)
b = NArray.float(3, 3); b.indgen!(10.0, 1.0)
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
p b
# => NArray.float(3,3): 
# [ [ 10.0, 11.0, 12.0 ], 
#   [ 13.0, 14.0, 15.0 ], 
#   [ 16.0, 17.0, 18.0 ] ]
#  => NArray.float(3,3): 
p a*b # 各要素ごとの積
# [ [ 10.0, 22.0, 36.0 ], 
#   [ 52.0, 70.0, 90.0 ], 
#   [ 112.0, 136.0, 162.0 ] ]

NMatrixクラスを使った場合は「*」などいくつかの演算子は 行列用のものが用いられます.

a = NMatrix.float(3, 3); a.indgen!(1.0, 1.0)
b = NMatrix.float(3, 3); b.indgen!(10.0, 1.0)
p a*b # 行列の積
# => NMatrix.float(3,3): 
# [ [ 84.0, 90.0, 96.0 ], 
#   [ 201.0, 216.0, 231.0 ], 
#   [ 318.0, 342.0, 366.0 ] ]

比較演算をした場合は byte 型のNArrayを返します.1が真,0が偽に対応しま す.

a = NArray.float(3, 3); a.indgen!(1.0, 1.0)
b = NArray.float(3, 3); b.indgen!(10.0, -1.0)
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
p b
# => NArray.float(3,3): 
# [ [ 10.0, 9.0, 8.0 ], 
#   [ 7.0, 6.0, 5.0 ], 
#   [ 4.0, 3.0, 2.0 ] ]
p a > b # 各要素ごとに大小を比較し,aのほうが大きい場所は1となる
# => NArray.byte(3,3): 
# [ [ 0, 0, 0 ], 
#   [ 0, 0, 1 ], 
#   [ 1, 1, 1 ] ]

NMathモジュールで各要素ごとの指数関数,三角関数の値などが計算できます.

a = NArray.float(3, 3); a.indgen!(1.0, 1.0)
p a
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
p NMath.exp(a)
# => NArray.float(3,3): 
# [ [ 2.71828, 7.38906, 20.0855 ], 
#   [ 54.5982, 148.413, 403.429 ], 
#   [ 1096.63, 2980.96, 8103.08 ] ]

NArray(ref)

NArrayには同じデータ保持領域を指す別のNArrayオブジェクトを生成できます. これをここでは NArray ref オブジェクトと呼びます. NArray#refer で生成することができます.

同じ領域を指すため,一方の内容を更新するともう一方の内容も更新されるよ うに見えます.

a = NArray[1.0, 2.0, 3.0]
b = a.refer
p a
# => NArray.float(3): 
# [ 1.0, 2.0, 3.0 ]
p b # NArray(ref) というのがrefオブジェクトであることを示している
# => NArray(ref).float(3): 
# [ 1.0, 2.0, 3.0 ]
a[1] = 4.0 # aの内容を変更する
p a
# => NArray.float(3): 
# [ 1.0, 4.0, 3.0 ]
p b # b の内容も変更されている
# => NArray(ref).float(3): 
# [ 1.0, 4.0, 3.0 ]

NArray#flatten, NArray#reshape の返り値は ref オブジェクトです. これによって同一の内容であるが, 次元の構造だけが異なるオブジェクトを作ることができます.

また,NArray.refer (実際にはこれを継承した NVector.refer や NMatrix.refer) で,データは同じであるがクラスだけが異なる オブジェクトを作ることができます.

NArray refオブジェクトが存在する理由は主に効率です. 例えばある行列の1行目をベクトルとして得たい場合,普通に インデックスで要素を切りとると

a = NMatrix[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
a[true, 1]
# => NMatrix.float(3,1): 
# [ [ 4.0, 5.0, 6.0 ] ]

となります.これを NVector にするためには,例えば

vector = NVector.float(3)
vector[] = a[true, 1].flatten

などとする必要がありますが,これにはメモリコピーが2回 (部分配列生成時とそれをNVectorに複製するのと)発生します. 大きな配列の場合はこのコピーのコストが馬鹿にならない場合があります. その場合,

NVector.refer(a[true, 1].flatten)

でメモリコピーを1回に抑えることができます.

内部実装

内部的には指定した型の1次元配列と, 次元の情報によって構成されています.メモリ配置はrow-majorです. すなわち

NArray.float(3,3): 
[ [ 1.0, 2.0, 3.0 ], 
  [ 4.0, 5.0, 6.0 ], 
  [ 7.0, 8.0, 9.0 ] ]  

という配列は,内部的にはメモリ上には

[1.0, 2.0, ... 9.0]

と並んでいます.これに「この配列は3x3である」というデータが付加されて います.

Lapackではcolumn-majorを用いるので,ruby-lapack では転置をする,転置に対 応する関数を呼びだす,などの必要があります.

NArray ref オブジェクトはこの一次元配列を共有することで実現されています.

Class Methods

NArray.new(type, *sizes)
NArray.byte(*sizes)
NArray.sint(*sizes)
NArray.lint(*sizes)
NArray.int(*sizes)
NArray.sfloat(*sizes)
NArray.dfloat(*sizes)
NArray.float(*sizes)
NArray.scomplex(*sizes)
NArray.dcomplex(*sizes)
NArray.complex(*sizes)
NArray.object(*sizes)

NArray オブジェクトを生成します.

sizes = [size1, ..., sizeN] のとき,次元が N でサイズが size1 x .. x sizeN である配列を確保し,返します.

new では任意の型の配列を作れます.typeで型を指定します. それ以外のメソッドでは特定の型の配列を作れます.

返り値は 0 もしくは nil で初期化されます.

type/メソッド名/データ型の対応は以下の通りです.

NArray.to_na(array)
NArray.to_narray(array)

配列から NArray オブジェクトを生成します. 配列のデータ型は配列の中身から自動判定します.

NArray.to_na([1, 2, 4])
# => NArray.int(3): 
# [ 1, 2, 4 ]
NArray.to_na([1.2, 0.8, 1])
# => NArray.float(3): 
# [ 1.2, 0.8, 1.0 ]
NArray.to_na([Complex(1.0, 2.0), 4.2])
# => NArray.complex(2): 
# [ 1.0+2.0i, 4.2+0.0i ]
NArray.to_na(string, type, *sizes)
NArray.to_narray(string, type, *sizes)

文字列から NArray オブジェクトを生成します.

s = [1.2, 2.0, 4.0, 1.3].pack("d4")
NArray.to_na(s, NArray::DFLOAT, 2, 2)
# => NArray.float(2,2): 
# [ [ 1.2, 2.0 ], 
#   [ 4.0, 1.3 ] ]

文字列をいかに数値に解釈するかは環境依存です.

sizes, type の意味は NArray.new と同じです.

例外

NArray.[*data]

dataから NArray オブジェクトを生成します.

NArray.to_na(data)

NArray[*data]

は同じ結果を返します.

NArray[[1, 2, 4]
# => NArray.int(3): 
# [ 1, 2, 4 ]
NArray.to_na[1.2, 0.8, 1]
# => NArray.float(3): 
# [ 1.2, 0.8, 1.0 ]
NArray[Complex(1.0, 2.0), 4.2]
# => NArray.complex(2): 
# [ 1.0+2.0i, 4.2+0.0i ]
NArray.mul(x, y)

x * y を返します. 詳しくは NArray#* を見てください.

NArray.div

x / y を返します. 詳しくは NArray#/ を見てください.

NArray.mul_add(a1, a2, *dims)

a1.mul_add(a2, *dims) と同じです. 詳しくは NArray#mul_add を見てください.

NArray.refer(nary)
NArray.ref(nary)

nary と同じ領域を参照する新たな NArray オブジェクトを返します.

NMatrix.refer, NVector.refer を用いることで,同じメモリ領域を示す ベクトルや行列を生成することができます.

NArray.srand(seed = nil)

NArray#randomで使う乱数をseedで初期化します.

引数を省略した場合は,時刻等から適当に初期化します.

Instance Methods

NArray#[*indices]

配列をインデックス参照します.

NArray#[*indices] = newdata

インデックスで指定した配列の部分を変更します.

NArray#slice(*indices)

配列をインデックス参照します.NArray#[]とほぼ同じですが 次元の縮約をしません.

NArray#shape
NArray#sizes

NArrayのサイズ(形)を整数の配列で返します.

NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]].shape
# => [3, 2]
NArray#size
NArray#total
NArray#length

NArrayの一次元的なサイズ(=要素数)を整数で返します.

NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]].total
# => 6
NArray#rank
NArray#dim
NArray#dimension

NArrayオブジェクトの次元を返します.

NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]].dim
# => 2
NArray#typecode

NArrayの配列の型を表す値を返します.

NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]].typecode
# => 5 
# NArray::DFLOAT が 5 である
NArray[[1, 2, 3]].typecode
# => 3
# NArray::INT が 3
NArray#element_size

NArrayの型の各要素が必要とするメモリサイズ(バイト数)を返します.

NArray[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]].element_size
# => 8
# 倍精度浮動小数点数は8byte
NArray[[1, 2, 3]].element_size 
# => 4
# 4byte
NArray#empty?

配列が空,つまり次元が0であるならば真を返します.

NArray[].empty?
# => true
NArray[1.0, 2.0].empty?
# => false
NArray#clone
NArray#dup

NArrayオブジェクトを複製します. 中のメモリ領域も複製が作られます.

NArray#refer では中のメモリ領域は複製されず共有されます.

NArray#reshape(*sizes)

配列の形を変えた NArray オブジェクトを返します.

配列のメモリ領域は共有されます.

m = NArray.float(2, 3); m.indgen!(1.0, 1.0)
p m
# => NArray.float(2,3): 
# [ [ 1.0, 2.0 ], 
#   [ 3.0, 4.0 ], 
#   [ 5.0, 6.0 ] ]
p m.reshape(3, 2)
# => NArray(ref).float(3,2): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ] ]
NArray#reshape!(*sizes)

配列の形を変更します.

m = NArray.float(2, 3); m.indgen!(1.0, 1.0)
p m
# => NArray.float(2,3): 
# [ [ 1.0, 2.0 ], 
#   [ 3.0, 4.0 ], 
#   [ 5.0, 6.0 ] ]
m.reshape!(3, 2)
p m
# => NArray(ref).float(3,2): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ] ]
NArray#shape=

do not use this method

NArray#newdim(*at)
NArray#newrank(*at)

次元を拡大した NArray オブジェクトを生成します.

at で指定した位置に次元を挿入した配列を新たに作ります. 新しいオブジェクトは内部領域を共有します. 挿入された場所のサイズは1となります.

m = NArray.float(2, 3); m.indgen!(1.0, 1.0)
p m
# => NArray.float(2,3): 
# [ [ 1.0, 2.0 ], 
#   [ 3.0, 4.0 ], 
#   [ 5.0, 6.0 ] ]
p m.newdim(0)
#  => NArray(ref).float(1,2,3): 
# [ [ [ 1.0 ], 
#     [ 2.0 ] ], 
#   [ [ 3.0 ], 
#     [ 4.0 ] ], 
#   [ [ 5.0 ], 
#     [ 6.0 ] ] ] 
p m.newdim(1)
# => NArray(ref).float(2,1,3): 
# [ [ [ 1.0, 2.0 ] ], 
#   [ [ 3.0, 4.0 ] ], 
#   [ [ 5.0, 6.0 ] ] ]
p m.newdim(0, 1)
# => NArray(ref).float(1,2,1,3): 
# [ [ [ [ 1.0 ], 
#       [ 2.0 ] ] ], 
#   [ [ [ 3.0 ], 
#       [ 4.0 ] ] ], 
#   [ [ [ 5.0 ], 
#       [ 6.0 ] ] ] ]
p m.newdim(0, 0)
# => NArray(ref).float(1,1,2,3): 
# [ [ [ [ 1.0 ] ], 
#     [ [ 2.0 ] ] ], 
#   [ [ [ 3.0 ] ], 
#     [ [ 4.0 ] ] ], 
#   [ [ [ 5.0 ] ], 
#     [ [ 6.0 ] ] ] ]

あまり使い道はありませんが,ベクトルを1xNやNx1の行列と 見なしたい場合には利用できます.

v = NVector[1.0, 2.0, 3.0]
p v
# => NVector.float(3): 
# [ 1.0, 2.0, 3.0 ]
p NMatrix.ref(v.newdim(0))
# => NMatrix(ref).float(1,3): 
# [ [ 1.0 ], 
#   [ 2.0 ], 
#   [ 3.0 ] ]
p NMatrix.ref(v.newdim(1))
# => NMatrix(ref).float(3,1): 
# [ [ 1.0, 2.0, 3.0 ] ]
NArray#newdim!(*at)
NArray#newrank!(*at)

NArrayオブジェクトの次元を拡大します.

詳しくは NArray#newdim を見てください.

NArray#newdim=
NArray#newrank=

Do not use these methods.

NArray#flatten

NArrayオブジェクトの次元を1にしたものを返します.

reshapeを用いて

# m は NArray オブジェクト
m.reshape(m.length)

としたのと同じです.

新たなオブジェクトとは内部領域を共有します.

m = NArray.float(2, 3); m.indgen!(1.0, 1.0)
p m
# => NArray.float(2,3): 
# [ [ 1.0, 2.0 ], 
#   [ 3.0, 4.0 ], 
#   [ 5.0, 6.0 ] ]
p m.flatten
# => NArray(ref).float(6): 
# [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ]
NArray#flatten!

NArrayオブジェクトの次元を1に変更します.

詳しくは NArray#flatten を見てください.

NArray#fill(val)
NArray#fill!(val)

NArrayを val で埋めます.

自身を返します.

NArray#indgen(start=0, step=1)
NArray#indgen!(start=0, step=1)

NArrayオブジェクトを start, start+step, start+2*step, ... で埋めます.

配列が2次元以上の場合は一次元と見なして配列を埋めます. 引数は整数しか取ることができません.

自身を返します.

m = NArray.float(5)
m.indgen
m
# => NArray.float(5): 
# [ 0.0, 1.0, 2.0, 3.0, 4.0 ]
n = NArray.float(2, 3)
n.indgen(2, 2)
n 
# => NArray.float(2,3): 
# [ [ 2.0, 4.0 ], 
#   [ 6.0, 8.0 ], 
#   [ 10.0, 12.0 ] ]
NArray#where

要素が0でないインデックスのNArray配列を返します.

intの1次元配列を返します.

NArray[1, 0, 0, 1].where
# => NArray.int(2): 
# [ 0, 3 ]
m = NArray.float(3, 3)
m.indgen!(2, 2)
n = m > 15
p n
# => NArray.byte(3,3):
# [ [ 0, 0, 0 ], 
#   [ 0, 0, 0 ], 
#   [ 0, 1, 1 ] ]
p n.where
# => NArray.int(2): 
# [ 7, 8 ]
NArray#where2

要素が0でないインデックスのNArray配列と, 要素が0であるインデックスのNArray配列を ペアで(Rubyの配列として)返します.

NArray[1, 0, 0, 1].where2
# => [NArray.int(2): 
# [ 0, 3 ], NArray.int(2): 
# [ 1, 2 ]]
m = NArray.float(3, 3)
m.indgen!(2, 2)
n = m > 15
p n
# => NArray.byte(3,3):
# [ [ 0, 0, 0 ], 
#   [ 0, 0, 0 ], 
#   [ 0, 1, 1 ] ]
p n.where2
# => [NArray.int(2): 
# [ 7, 8 ], NArray.int(7): 
# [ 0, 1, 2, 3, 4, 5, 6 ]]
NArray#each{|x| ... }

NArrayオブジェクトの各要素に対しブロックを呼びだします.

nilを返します.

NArray[[1.0, 2.0], [3.0, 4.0]].each{|x| p x}
# => 1.0
# => 2.0
# => 3.0
# => 4.0
NArray#collect

NArrayオブジェクトの各要素に対しブロックを呼びだし,その返り値で 構成される新たな NArray オブジェクトを返します.

返り値の NArray オブジェクトの次元,サイズ,型はレシーバと同じに なります.

p NArray[[1.0, 2.0], [3.0, 4.0]].collect{|x| x+1 }
# => NArray.float(2,2): 
# [ [ 2.0, 3.0 ], 
#   [ 4.0, 5.0 ] ]
p NArray[1, 2, 3].collect{|x| x+3}
# => NArray.int(3): 
# [ 4, 5, 6 ]
#
# ブロックの返り値が適当でない場合は変換しようと試みる 
p NArray[1, 2, 3].collect{|x| x+1.5}
# => NArray.int(3): 
# [ 2, 3, 4 ]
# 変換できない場合は TypeError
p NArray[1, 2, 3].collect{|x| nil}
# => TypeError: no implicit conversion from nil to integer
NArray#collect!{|x| ... }

NArrayオブジェクトの各要素に対しブロックを呼びだし,その返り値で 配列の各要素を置き換えます.

詳しくは NArray#collect! を見てください.

NArray#to_a

NArrayオブジェクトをRubyの配列に変換して返します.

p NArray[[1.0, 2.0], [3.0, 4.0]].to_a
# => [[1.0, 2.0], [3.0, 4.0]]
p NArray[1, 2, 3]
# => [1, 2, 3]
NArray#to_s

NArrayオブジェクトをバイナリ文字列したものを返します.

NArray#to_f

NArrayオブジェクトの各要素を浮動小数点数に変換した NArrayオブジェクトを返します.

通常新しいNArrayオブジェクトの型はsfloat(単精度)ですが,元のオブジェク トの型が sfloatより豊富な情報を持っている型(float, scomplex, complex)の場合 その型のNArrayオブジェクトを返します(つまり単なるコピーを返します).

p NArray[1, 2, 3].to_f
# => NArray.sfloat(3): 
# [ 1.0, 2.0, 3.0 ]
p NArray[1.0, 2.0, 3.0].to_f
# => NArray.float(3): 
# [ 1.0, 2.0, 3.0 ]
NArray#to_i

NArrayオブジェクトの各要素を整数に変換した NArrayオブジェクトを返します.

通常新しいNArrayオブジェクトの型はint(4byte符号付き整数)ですが, 元のオブジェクトの型がsintやbyteである場合はその型の NArrayオブジェクトを返します(つまり単なるコピーを返します).

p NArray[1.0, 2.0, 3.0].to_i
# => NArray.int(3): 
# [ 1, 2, 3 ]
NArray#to_type(newtype)

NArrayオブジェクトの各要素をnewtypeで表される型に変換した NArrayオブジェクトを返します.

より「狭い」型への変換では,小数部を切り捨てたり 虚数部を捨てたりします.

m = NArray.float(3, 3); m.indgen!
p m
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p m.to_type(NArray::SFLOAT)
# => NArray.sfloat(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p m.to_type(NArray::SINT)
# => NArray.sint(3,3): 
# [ [ 0, 1, 2 ], 
#   [ 3, 4, 5 ], 
#   [ 6, 7, 8 ] ]
NArray#to_binary

NArrayオブジェクトの各要素をバイナリに 変換したNArrayオブジェクトを返します.

各要素は byte 型の1次元の配列に変換されます. すなわち変換後のNArrayオブジェクトは次元が1増えます.

バイナリへの変換法は環境依存です.

p NArray[[1.1, 2.2],[3.3, 4.4]].to_binary
# => NArray.byte(8,2,2): 
# [ [ [ 154, 153, 153, 153, 153, 153, 241, 63 ], 
#     [ 154, 153, 153, 153, 153, 153, 1, 64 ] ], 
#   [ [ 102, 102, 102, 102, 102, 102, 10, 64 ], 
#     [ 154, 153, 153, 153, 153, 153, 17, 64 ] ] ]
NArray#to_type_as_binary(type)

NArrayオブジェクトの内容を バイナリ列と見なし,typeの型を持つ1次元配列に変換します.

m = NArray[[1.1, 2.2],[3.3, 4.4]].to_binary
p m
# => NArray.byte(8,2,2): 
# [ [ [ 154, 153, 153, 153, 153, 153, 241, 63 ], 
#     [ 154, 153, 153, 153, 153, 153, 1, 64 ] ], 
#   [ [ 102, 102, 102, 102, 102, 102, 10, 64 ], 
#     [ 154, 153, 153, 153, 153, 153, 17, 64 ] ] ]
p m.to_type_as_binary(NArray::FLOAT)
# => NArray.float(4): 
# [ 1.1, 2.2, 3.3, 4.4 ]
p m.to_type_as_binary(NArray::COMPLEX)
# => NArray.complex(2): 
# [ 1.1+2.2i, 3.3+4.4i ]
m.to_type_as_binary(NArray::SFLOAT)
# => NArray.sfloat(8): 
# [ -1.58819e-23, 1.8875, -1.58819e-23, 2.025, 2.72008e+23, 2.1625,
#  ... ]
NArray#to_string

使わないでください.

NArray#count_false

byte型のNArrayオブジェクトの0の要素の個数を返します.

@raise TypeError byte型以外の場合に発生します.

NArray#count_true

byte型のNArrayオブジェクトの0以外の要素の個数を返します.

@raise TypeError byte型以外の場合に発生します.

NArray#mask(mask)

self[mask] と同じです.ただし NArrayオブジェクトによるマスクのみ 可能です.

NArray#+(other)
NArray#-(other)
NArray#*(other)
NArray#/(other)
NArray#**(other)
NArray#%(other)
NArray#mod(other)

self と other の対応する各要素同士の 加算/減算/乗算/除算/べき乗/剰余を計算した配列を返します.

整数同士の除算は整除を,浮動小数点数を含む場合は通常の除算をします. 浮動小数点数の剰余は fmod で計算されます.

p NArray[1.0, 2.0, 3.0]*NArray[3.0, 4.0, 5.0]
# => NArray.float(3): 
# [ 3.0, 8.0, 15.0 ]

例外

NArray#-@

NArrayオブジェクトの各要素の符号を反転したものを返します.

p -NArray[1.0, 2.0, 3.0]
# => float(3): 
# [ -1.0, -2.0, -3.0 ]
NArray#&(other)
NArray#|(other)
NArray#^(other)

self と other の対応する各要素同士の ビットAND, ビットOR, ビットXORを計算した配列を返します.

整数以外でビット演算をしようとした場合には例外 TypeError が発生します

NArray#~@

NArrayオブジェクトの各要素のビットを反転させたものを 返します.

NArray#add!(other)
NArray#sbt!(other)
NArray#mul!(other)
NArray#div!(other)
NArray#mod!(other)

self と other の対応する各要素同士の 加算/減算/乗算/除算/剰余を計算し, それを self にセットします.

m = NArray[1.0, 2.0, 3.0]
m.mul!(NArray[3.0, 4.0, 5.0])
p m
# => NArray.float(3): 
# [ 3.0, 8.0, 15.0 ]
NArray#swap_byte

NArrayオブジェクトの各要素をバイトスワップした NArrayオブジェクトを返します.

m = NArray[0x7f, 0x7f00, 0x7f0000, 0x7f000000]
p m
# => NArray.int(4): 
# [ 127, 32512, 8323072, 2130706432 ]
p m.swap_byte
# => NArray.int(4): 
# [ 2130706432, 8323072, 32512, 127 ]
NArray#hton

NArrayオブジェクトの各要素をホストバイトオーダから ネットワークバイトオーダに変換した NArrayオブジェクトを返します.

m = NArray[0x7f, 0x7f00, 0x7f0000, 0x7f000000]
p m
# => NArray.int(4): 
# [ 127, 32512, 8323072, 2130706432 ]
p m.hton
# => NArray.int(4): 
# [ 2130706432, 8323072, 32512, 127 ]
NArray#ntoh

NArrayオブジェクトの各要素をネットワークバイトオーダから ホストバイトオーダに変換した NArrayオブジェクトを返します.

NArray#htov

NArrayオブジェクトの各要素をネットワークバイトオーダから VAXバイトオーダに変換した NArrayオブジェクトを返します.

NArray#vtoh

NArrayオブジェクトの各要素をVAXバイトオーダから ネットワークバイトオーダに変換した NArrayオブジェクトを返します.

NArray#abs

NArrayオブジェクトの各要素の絶対値を 要素に持つNArrayオブジェクトを返します.

返り値の配列の型は

となります.

m = NArray[Complex(1.0, 1.0), Complex(-1.0, 0.0)]
p m
# => NArray.complex(2): 
# [ 1.0+1.0i, -1.0+0.0i ]
p  m.abs
# => NArray.float(2): 
# [ 1.41421, 1.0 ]
NArray#recip

NArrayオブジェクトの各要素の逆数を 要素に持つNArrayオブジェクトを返します.

返り値のNArrayオブジェクトの型は元のものと同じものを返します.

NArray#real

NArrayオブジェクトの各要素の実部を要素に持つ NArrayオブジェクトを返します.

レシーバが複素数以外の型を持つならば, レシーバの複製が返されます.

返り値の配列の型は

となります.

NArray#imag
NArray#image

NArrayオブジェクトの各要素の虚部を要素に持つ NArrayオブジェクトを返します.

レシーバが複素数以外の型を持つならば, 返り値の配列はすべて0で埋められます.

返り値の配列の型は

となります.

NArray#angle
NArray#arg

NArrayオブジェクトの各要素の偏角を要素に持つ NArrayオブジェクトを返します.

レシーバが複素数以外の型ならば, 例外 TypeError が発生します.

返り値の配列の型は

となります.

NArray#conj
NArray#conjugate

NArrayオブジェクトの各要素の複素共役を要素に持つ NArrayオブジェクトを返します.

レシーバが複素数以外の型を持つならば, レシーバの複製が返されます.

NArray#conj!
NArray#conjugate!

NArrayオブジェクトの各要素をその複素共役で置き換えます.

レシーバが複素数以外の型を持つならば, 何もしません.

NArray#im

NArrayオブジェクトの各要素に虚数単位(√-1)を かけた値を要素に持つNArrayオブジェクトを返します.

返り値の配列の型は

となります.

NArray#floor

NArrayオブジェクトの各要素のfloor(その値を越えない最大の整数) を要素に持つNArrayオブジェクトを返します.

複素数型にはfloorが定義できないためTypeErrorとなります. float/sfloat型の場合の返り値はint型になります. それ以外の整数型ではレシーバのコピーが返ります.

NArray#ceil

NArrayオブジェクトの各要素のfloor(その値以上で最小の整数) を要素に持つNArrayオブジェクトを返します.

複素数型にはceilが定義できないためTypeErrorとなります. float/sfloat型の場合の返り値はint型になります. それ以外の整数型ではレシーバのコピーが返ります.

NArray#round

NArrayオブジェクトの各要素のround(最も近い整数) を要素に持つNArrayオブジェクトを返します.

複素数型にはceilが定義できないためTypeErrorとなります. float/sfloat型の場合の返り値はint型になります. それ以外の整数型ではレシーバのコピーが返ります.

NArray#eq(other)
NArray#ne(other)
NArray#gt(other)
NArray#> (other)
NArray#ge(other)
NArray#>=(other)
NArray#lt(other)
NArray#< (other)
NArray#le(other)
NArray#<=(other)

NArrayオブジェクトと otherの対応する各要素を比較して, 条件が成立している位置には1,そうでない位置には0が置かれた byte型のNArrayオブジェクトを返します.

異なる型の比較はより広い型のほうに変換して比較します.

複素数を大小比較しようとすると例外 TypeError が発生します.

NArray#<=>(other)

NArrayオブジェクトと otherの対応する各要素を比較して,左辺が大きければ 1 を,右辺が大きければ 2 を,等しければ 0 であるような byte型のNArrayオブジェクトを返します.

Rubyの通常の規約(1, -1, 0)と異なるので注意してください.

m = NArray.int(3, 3); m.indgen!(0, 1)
n = NArray.int(3, 3); n.indgen!(6, -1)
p m
# => NArray.int(3,3): 
# [ [ 0, 1, 2 ], 
#   [ 3, 4, 5 ], 
#   [ 6, 7, 8 ] ]
p n
# => NArray.int(3,3): 
# [ [ 6, 5, 4 ], 
#   [ 3, 2, 1 ], 
#   [ 0, -1, -2 ] ]
p m <=> n
# => NArray.byte(3,3): 
# [ [ 2, 2, 2 ], 
#   [ 0, 1, 1 ], 
#   [ 1, 1, 1 ] ]
NArray#and(other)
NArray#or(other)
NArray#xor(other)

2つのNArrayオブジェクトの各要素の論理and/or/xorを取ったものを 要素とするbyte型のNArrayオブジェクトを返します.

0が偽,それ以外が真で,真値の代表値は1です.

NArray#not

各要素の論理否定を取ったものを 要素とするbyte型のNArrayオブジェクトを返します.

0が偽,それ以外が真で,真値の代表値は1です.

NArray#sum(*dims)
NArray#accum(*dims)

指定した次元に対する和を取ります.

sumの場合,指定した次元は縮約されます.accumでは縮約されません. 次元を指定しない場合は配列のすべての要素の和を取ります.

m = NArray.float(3,3); m.indgen
p m
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p m.sum
# => 36.0
p m.sum(0)
# => NArray.float(3): 
# [ 3.0, 12.0, 21.0 ]
p m.sum(1)
# => NArray.float(3): 
# [ 9.0, 12.0, 15.0 ]
p m.sum(0,1)
# => 36.0

NMatrixはNArrayの場合と多少異なる挙動をします.

m = NMatrix.float(3, 3); m.indgen
p m
# => NMatrix.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p m.sum
# => 36.0
p m.sum(0)
# => NMatrix.float(1,3): 
# [ [ 3.0 ], 
#   [ 12.0 ], 
#   [ 21.0 ] ]
p m.sum(1)
# => NMatrix.float(3,1): 
# [ [ 9.0, 12.0, 15.0 ] ]
NArray#prod

指定した次元に対する積を取ります.

指定した次元は縮約されます. 次元を指定しない場合は配列のすべての要素の積を取ります.

m = NArray.float(3, 3); m.indgen(1, 1)
p m
# => NArray.float(3,3): 
# [ [ 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0 ], 
#   [ 7.0, 8.0, 9.0 ] ]
p m.prod
# => 362880.0
p m.prod(0)
# => NArray.float(3): 
# [ 6.0, 120.0, 504.0 ]
p m.prod(1)
# => NArray.float(3): 
# [ 28.0, 80.0, 162.0 ]
p m.prod(0,1)
# => 362880.0
NArray#min(*dims)
NArray#max(*dims)

指定した次元に対する最小/最大を取ります.

指定した次元は縮約されます. 次元を指定しない場合は配列のすべての要素の最大/最小を取ります.

m = NArray.float(3,3); m.indgen
p m
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p m.max
# => 8.0
p m.max(0)
# => NArray.float(3): 
# [ 2.0, 5.0, 8.0 ]
p m.max(1)
# => NArray.float(3): 
# [ 6.0, 7.0, 8.0 ]
p m.max(0,1)
# => 8.0
NArray#cumsum

配列の前からの累積和を返します.

1次元の配列のみ計算できます.

m = NArray.float(5); m.indgen
p m
# => NArray.float(5): 
# [ 0.0, 1.0, 2.0, 3.0, 4.0 ]
p m.cumsum
# => NArray.float(5): 
# [ 0.0, 1.0, 3.0, 6.0, 10.0 ]
# これは [0.0, 0.0+1.0, 0.0+1.0+2.0, 0.0+1.0+2.0+3.0, 0.0+1.0+2.0+3.0+4.0]
# の結果

配列が1次元でない場合には例外 TypeError 発生します.

NArray#cumsum!

自身を配列の累積和に変化させます.

1次元の配列のみ計算できます.

m = NArray.float(5); m.indgen
p m
# => NArray.float(5): 
# [ 0.0, 1.0, 2.0, 3.0, 4.0 ]
m.cumsum!
p m
# => NArray.float(5): 
# [ 0.0, 1.0, 3.0, 6.0, 10.0 ]

配列が1次元でない場合には例外 TypeError 発生します.

NArray#cumprod

配列の前からの累積積を返します.

m = NArray[1.0, 2.0, 3.0, 4.0, 5.0]
p m.cumprod
# => NArray.float(5): 
# [ 1.0, 2.0, 6.0, 24.0, 120.0 ]
NArray#sort(dim=-1)

配列をソートし,その結果を返します.

0から指定した次元までの部分配列をそれぞれソートします. 負数を指定した場合には末尾から次元を数えます.

m = NArray.float(3,3); m.random
p m
# => NArray.float(3,3): 
# [ [ 0.267127, 0.227931, 0.126313 ], 
#   [ 0.952139, 0.920288, 0.616114 ], 
#   [ 0.0609723, 0.343488, 0.214907 ] ]
p m.sort(0) # 0次元までのソート(各行をソート)
# => NArray.float(3,3): 
# [ [ 0.126313, 0.227931, 0.267127 ], 
#   [ 0.616114, 0.920288, 0.952139 ], 
#   [ 0.0609723, 0.214907, 0.343488 ] ]
p m.sort(1) # 1次元までのソート(つまりすべての要素をソート)
# => NArray.float(3,3): 
# [ [ 0.0609723, 0.126313, 0.214907 ], 
#   [ 0.227931, 0.267127, 0.343488 ], 
#   [ 0.616114, 0.920288, 0.952139 ] ]
p m.sort # すべての要素をソート
# => NArray.float(3,3): 
# [ [ 0.0609723, 0.126313, 0.214907 ], 
#   [ 0.227931, 0.267127, 0.343488 ], 
#   [ 0.616114, 0.920288, 0.952139 ] ]
NArray#sort!(dim=-1)

自身を破壊的にソートします.

詳しくは NArray#sort を見てください.

NArray#transpose(*dims)

転置した配列を返します.

m = NArray.float(3,3,3); m.indgen(0, 1)
p m
# => NArray.float(3,3,3): 
# [ [ [ 0.0, 1.0, 2.0 ], 
#     [ 3.0, 4.0, 5.0 ], 
#     [ 6.0, 7.0, 8.0 ] ], 
#   [ [ 9.0, 10.0, 11.0 ], 
#     [ 12.0, 13.0, 14.0 ], 
#     [ 15.0, 16.0, 17.0 ] ], 
#   [ [ 18.0, 19.0, 20.0 ], 
#     [ 21.0, 22.0, 23.0 ], 
#     [ 24.0, 25.0, 26.0 ] ] ]
m.transpose(1, 0, 2) # 最初の次元と2番目の次元を入れ替える
# => NArray.float(3,3,3): 
# [ [ [ 0.0, 3.0, 6.0 ], 
#     [ 1.0, 4.0, 7.0 ], 
#     [ 2.0, 5.0, 8.0 ] ], 
#   [ [ 9.0, 12.0, 15.0 ], 
#     [ 10.0, 13.0, 16.0 ], 
#     [ 11.0, 14.0, 17.0 ] ], 
#   [ [ 18.0, 21.0, 24.0 ], 
#     [ 19.0, 22.0, 25.0 ], 
#     [ 20.0, 23.0, 26.0 ] ] ]
m.transpose(1, 0) # transpose(1, 0, 2) と同じ

例外

NArray#sort_index(dim=-1)

配列をソートし,そのインデックスを返します.

次元の指定など詳しくは NArray#sort を見てください.

m = NArray.float(3,3); m.random
p m
# => NArray.float(3,3): 
# [ [ 0.267127, 0.227931, 0.126313 ], 
#   [ 0.952139, 0.920288, 0.616114 ], 
#   [ 0.0609723, 0.343488, 0.214907 ] ]
m.sort_index
# => NArray.int(3,3): 
# [ [ 6, 2, 8 ], 
#   [ 1, 0, 7 ], 
#   [ 5, 4, 3 ] ]
m.sort_index(0)
# => NArray.int(3,3): 
# [ [ 2, 1, 0 ], 
#   [ 5, 4, 3 ], 
#   [ 6, 8, 7 ] ]
m[m.sort_index(0)] # これは m.sort(0) と同じ
# => NArray.float(3,3): 
# [ [ 0.126313, 0.227931, 0.267127 ], 
#   [ 0.616114, 0.920288, 0.952139 ], 
#   [ 0.0609723, 0.214907, 0.343488 ] ]
m.sort_index(1)
# => NArray.int(3,3): 
# [ [ 6, 2, 8 ], 
#   [ 1, 0, 7 ], 
#   [ 5, 4, 3 ] ]
m[m.sort_index(1)] # m.sort(1) と同じ
# => NArray.float(3,3): 
# [ [ 0.0609723, 0.126313, 0.214907 ], 
#   [ 0.227931, 0.267127, 0.343488 ], 
#   [ 0.616114, 0.920288, 0.952139 ] ]
NArray#imag=(ary)

配列の各要素の虚部に ary を設定します.

u = NArray[1.0, 2.0, 3.0]
v = NArray[4.0, 5.0, 6.0]
w = NArray.complex(3)
w[] = u
p w
# => NArray.complex(3): 
# [ 1.0+0.0i, 2.0+0.0i, 3.0+0.0i ]
w.imag = v
p w
# => NArray.complex(3): 
# [ 1.0+4.0i, 2.0+5.0i, 3.0+6.0i ]

例外

NArray#random

配列を複製し,各要素に [0, 1) の範囲の一様乱数値をセットした ものを返します.

NArray#random!

配列の各要素に [0, 1) の範囲の一様乱数値をセットします.

NArray#mul_add(other, *dims)

self と other と各要素の積を取り,結果を sum(*dims) で和を取ります.

結果は (self*other).sum(*dims)と同じですが,中間オブジェクトを 作らないので多少高速です.

m = NArray.float(3,3); m.indgen(0, 1)
n = NArray.float(3,3); n.indgen(-3, 1)
p m
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p n
# => NArray.float(3,3): 
# [ [ -3.0, -2.0, -1.0 ], 
#   [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ] ]
p m.mul_add(n, 0) 
# => NArray.float(3): 
# [ -4.0, 14.0, 86.0 ]
p m.mul_add(n, 1)
# => NArray.float(3): 
# [ 18.0, 30.0, 48.0 ]
m.mul_add(n, 0, 1)
# => 96.0

@raise ArgumentError dimsが空である場合に発生します

NArray#mul_accum(other, *dims)

self と other と各要素の積を取り,結果を accum(*dims) で和を取ります.

NArray#mul_add とほぼ同じですが,次元の縮約を行わないことが異なります.

m = NArray.float(3,3); m.indgen(0, 1)
n = NArray.float(3,3); n.indgen(-3, 1)
p m
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p n
# => NArray.float(3,3): 
# [ [ -3.0, -2.0, -1.0 ], 
#   [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ] ]
m.mul_add(n, 0, 1)
# => NArray.float(1,1): 
# [ [ 96.0 ] ]

@raise ArgumentError dimsが空である場合に発生します

NArray#refer

self と同じメモリ領域を指す別のNArrayオブジェクトを返します.

m = NArray.float(3,3)
n = m.refer
p n
# => NArray.float(3,3): 
# [ [ 0.0, 0.0, 0.0 ], 
#   [ 0.0, 0.0, 0.0 ], 
#   [ 0.0, 0.0, 0.0 ] ]
m[1,1] = 1.0 # mを変更すると
p n          # nも変更される
# => NArray(ref).float(3,3): 
# [ [ 0.0, 0.0, 0.0 ], 
#   [ 0.0, 1.0, 0.0 ], 
#   [ 0.0, 0.0, 0.0 ] ]
NArray#original

NArray#refer, NArray.refer などで作った NArray ref オブジェクトの元となる NArrayオブジェクトを返します.

ref オブジェクトでない NArray オブジェクトでは nil を返します.

m = NArray.float(3,3)
n = m.refer
n.object_id == m.object_id
# => false
n.original.object_id == m.object_id
# => true
m.original
# => nil
NArray#integer?

NArrayオブジェクトとしての型が整数(int, sint, byte)であれば真を返します.

NArray#complex?

NArrayオブジェクトとしての型が複素数(complex, scomplex)であれば真を返します.

NArray#all?

配列のすべての要素が真値(0以外)であればtrueを返します.

NArray#any?

配列に真値(0以外)を含むならばtrueを返します.

NArray#none?

配列に真値(0以外)を含まないならばtrueを返します.

NArray#==(other)

otherと内容が一致するならばtrueを返します.

NArray#rank_total(*ranks)

ranks で示された次元に限定した場合の配列の大きさを返します.

m.shape.values_at(*ranks).inject(&:*)

と同じです.

m = NArray.float(2, 3, 4, 5, 6)
m.rank_total(1, 2, 4)
# => 72  # 3 * 4 * 6
NArray#delete_at(*selectors)

インデックスで指定した行/列を削除した新たなNArrayオブジェクトを返します.

m = NArray.float(4, 4); m.indgen
p m
# => NArray.float(4,4): 
# [ [ 0.0, 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0, 7.0 ], 
#   [ 8.0, 9.0, 10.0, 11.0 ], 
#   [ 12.0, 13.0, 14.0, 15.0 ] ]

# 2列目を削除する
p m.delete_at(2)
# => NArray.float(3,4): 
# [ [ 0.0, 1.0, 3.0 ], 
#   [ 4.0, 5.0, 7.0 ], 
#   [ 8.0, 9.0, 11.0 ], 
#   [ 12.0, 13.0, 15.0 ] ]

# 2行目,3行目を削除
p m.delete_at([], 2..3)
# => NArray.float(4,2): 
# [ [ 0.0, 1.0, 2.0, 3.0 ], 
#   [ 4.0, 5.0, 6.0, 7.0 ] ]

# 2列目と1行目を削除
p m.delete_at(2, 1)
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 3.0 ], 
#   [ 8.0, 9.0, 11.0 ], 
#   [ 12.0, 13.0, 15.0 ] ]
NArray#mean(*ranks)

ranksで指定した次元に関する平均を取ります.

引数を省略すると,すべての要素の平均を取ります. 指定した次元は縮約されます.

m = NArray.float(3,3); m.indgen
p m
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p m.mean
# => 4.0
p m.mean(0)
# => NArray.float(3): 
# [ 1.0, 4.0, 7.0 ]
p m.mean(1)
# => NArray.float(3): 
# [ 3.0, 4.0, 5.0 ]
NArray#stddev(*ranks)

ranksで指定した次元に関する不偏標準偏差を取ります.

引数を省略すると,すべての要素の標準偏差を取ります. 指定した次元は縮約されます.

m = NArray.float(3,3); m.indgen
p m
# => NArray.float(3,3): 
# [ [ 0.0, 1.0, 2.0 ], 
#   [ 3.0, 4.0, 5.0 ], 
#   [ 6.0, 7.0, 8.0 ] ]
p m.stddev
# => 2.7386127875258306
p m.stddev(0)
# => NArray.float(3): 
# [ 1.0, 1.0, 1.0 ]
p m.stddev(1)
# => NArray.float(3): 
# [ 3.0, 3.0, 3.0 ]
p m.stddev(0, 1)
# => 2.7386127875258306
NArray#rms
NArray#rmsdev
NArray#median(rank=self.dim-1)

指定した次元までの要素ごとのメジアン(中央値)を取ります.

m = NArray.float(3,3,3); m.indgen
p m
# => NArray.float(3,3,3): 
# [ [ [ 0.0, 1.0, 2.0 ], 
#     [ 3.0, 4.0, 5.0 ], 
#     [ 6.0, 7.0, 8.0 ] ], 
#   [ [ 9.0, 10.0, 11.0 ], 
#     [ 12.0, 13.0, 14.0 ], 
#     [ 15.0, 16.0, 17.0 ] ], 
#   [ [ 18.0, 19.0, 20.0 ], 
#     [ 21.0, 22.0, 23.0 ], 
#     [ 24.0, 25.0, 26.0 ] ] ]
p m.median(0)
#  => NArray.float(3,3): 
# [ [ 1.0, 4.0, 7.0 ], 
#   [ 10.0, 13.0, 16.0 ], 
#   [ 19.0, 22.0, 25.0 ] ]
p m.median(1)
# => NArray.float(3): 
# [ 4.0, 13.0, 22.0 ]
p m.median(2)
# => 13.0

要素の個数が偶数の場合,中央の2つの値の平均を中央値とみなします.

NArray[1.0, 2.0, 3.0, 4.0].median
# => 2.5
NArray#randomn

配列を複製して,の各要素に平均0,分散1の正規分布に従う乱数値を セットしたものを返します.

NArray#randomn!

配列の各要素に平均0,分散1の正規分布に従う乱数値を セットします.

m = NArray.float(4)
m.randomn!
p m
# => NArray(ref).float(4): 
# [ -0.703405, 0.197133, 0.526395, -0.355031 ]

Constants

NArray::NARRAY_VERSION

NArrayライブラリのバージョン.

NArray::BYTE

byte型 (1 byte unsigned 整数)を表す定数

NArray::SINT

sint型 (2 byte signed 整数)を表す定数

NArray::LINT
NArray::INT

int型 (4 byte signed 整数)を表す定数

NArray::SFLOAT

sfloat型 (single precision 浮動小数点数)を表す定数

NArray::DFLOAT
NArray::FLOAT

float型 (double precision 浮動小数点数)を表す定数

NArray::SCOMPLEX

scomplex型 (single precision 浮動小数点数による複素数)を表す定数

NArray::DCOMPLEX
NArray::COMPLEX

complex型 (double precision 浮動小数点数による複素数)を表す定数

NArray::ROBJ
NArray::OBJECT

object型 (Rubyの任意のオブジェクト)を表す定数

class NVector

Instance Methods

NVector#*(other)

other が NVector の場合は,内積を取ります. other が NMatrix の場合は,自身を横ベクトルと見なして 行列を作用させ,結果のベクトルを返します. other がスカラーの場合は,各要素をスカラー倍します.

NVector#/(other)

other が行列の場合は,other.lu.solve(self)(もしくはother.inverse*self) を計算します. other がスカラーの場合は,各要素をその値で割ります.

NVector#**(other)

other == 2 の場合だけが利用可能で, その場合は self との内積(つまりnormの二乗)を返します.

class NMatrix

Instance Methods

NMatrix#lu_fact!
NMatrix#lu!

LU分解を計算し,結果を NMatrixLU のインスタンスとして返します.

LU分解の計算のために,selfは破壊的に変更されます.

例外

NMatrix#lu_fact
NMatrix#lu

LU分解を計算し,結果を NMatrixLU のインスタンスとして返します.

lu! とは異なり,selfは変更されません.

例外

NMatrix#*(other)

other が NMatrix の場合,行列としての積を返します other が NVector の場合,行列をベクトルに作用させた結果のベクトルを 返します. other がスカラーの場合は,スカラー倍します.

NMatrix#/(other)

other が NMatrix の場合は,other.lu.solve(self) (もしくは other.inverse * self) を返します. other がスカラーの場合は,その値で各要素を割ります.

NMatrix#**(other)

行列の other 乗を返します.

other は整数のみ指定できます.

NMatrix#inverse

逆行列を返します.

例外

NMatrix#diagonal!(val=1)

self を破壊的に対角行列に変更します.

valがスカラーである場合には対角成分はすべてその値にセットされます. valがNArrayやArrayである場合には対角成分はその内容になります.

m = NMatrix.float(3, 3)
p m
# => NMatrix.float(3,3): 
# [ [ 0.0, 0.0, 0.0 ], 
#   [ 0.0, 0.0, 0.0 ], 
#   [ 0.0, 0.0, 0.0 ] ]
m.diagonal!(3.0)
p m
# => NMatrix.float(3,3): 
# [ [ 3.0, 0.0, 0.0 ], 
#   [ 0.0, 3.0, 0.0 ], 
#   [ 0.0, 0.0, 3.0 ] ]
m.diagonal!(NArray[1.0, 2.0, 3.0])
p m
# => NMatrix.float(3,3): 
# [ [ 1.0, 0.0, 0.0 ], 
#   [ 0.0, 2.0, 0.0 ], 
#   [ 0.0, 0.0, 3.0 ] ]

行列が正方行列でない場合にも利用できます.

m = NMatrix.float(2, 3)
m.diagonal!(1.0)
p m
# => NMatrix.float(2,3): 
# [ [ 1.0, 0.0 ], 
#   [ 0.0, 1.0 ], 
#   [ 0.0, 0.0 ] ]
NMatrix#diagonal(val)

同じ形を持つ対角成分が val である対角行列を返します.

詳しくは NMatrix#diagonal! を見てください.

NMatrix#unit
NMatrix#identity
NMatrix#I

self を破壊的に単位行列(対角成分が1の行列)に変更します

NMatrix#transpose

転置行列を返します.

NArray#transpose と挙動が多少異なることに注意してください.

class NMatrixLU

LU分解を表すクラスです,NMatrix#lu, NMatrix#lu! の返り値として 得られるクラスです.

Instance Methods

NMatrixLU#solve(y)

LU分解を利用して Ax = y の解 x を求めます.

A はLU分解をした行列です.

module NMath

Module Functions

NMath.#recip(x)

x の各要素の逆数を取った NArray オブジェクトを返します.

NMath.#sqrt

x の各要素の平方根取った NArray オブジェクトを返します.

NMath.#exp(x)

x の各要素の指数関数の値を取った NArray オブジェクトを返します.

NMath.#log(x)
NMath.#log10(x)
NMath.#log2(x)

x の各要素の自然対数/10の対数/2の対数関数の値を 取った NArray オブジェクトを返します.

NMath.#sin(x)
NMath.#cos(x)
NMath.#tan(x)
NMath.#asin(x)
NMath.#acos(x)
NMath.#atan(x)
NMath.#csc(x)
NMath.#acsc(x)
NMath.#sec(x)
NMath.#asec(x)
NMath.#cot(x)
NMath.#acot(x)

x の各要素の各三角関数/逆三角関数の値を取った NArray オブジェクトを返します.

NMath.#sinh(x)
NMath.#cosh(x)
NMath.#tanh(x)
NMath.#asinh(x)
NMath.#acosh(x)
NMath.#atanh(x)
NMath.#csch(x)
NMath.#acsch(x)
NMath.#sech(x)
NMath.#asech(x)
NMath.#coth(x)
NMath.#acoth(x)
NMath.#atan2(x, y)

x の各要素の各双曲線関数/逆双曲線関数の値を取った NArray オブジェクトを返します.

atan2 はxとyの対応する要素のペアごとに atan2 を取ります.

NMath.#covariance(x, y, *ranks)

x と y の相関係数を返します.

ranks を指定すると指定した次元に関する相関係数を取り, 省略した場合はすべての要素に対する相関係数を取ります.

ranks で指定した次元は縮約されます.

Constants

NMath::E

自然対数の底. Math::E と同じ.

NMath::PI

円周率. Math::PI と同じ.