ndarray = "0.12.1"
Rust で行列を扱う場合いくつかのクレートがあってどれを採用するか若干悩みますが, ここでは ndarray の使い方を説明します. ベーシックな使い方は こちら と こちら で解説されているので, 本記事ではこれらの記事で扱いが軽い Array
インスタンスを取得する方法にフォーカスします (その結果 公式ドキュメント のクローンみたいな感じになっています).
成分を直書きする場合に万能なのが ndarray::array
マクロで, これは標準ライブラリの vec!
マクロに相当します. 用例は以下のコード例を参照してください.
Dim = 1 (いわゆるベクトル)
use ndarray::Array1;
として Array1
をスコープに入れておきます.
成分を直書き
let v: Array1<i16> = ndarray::arr1( &[ 2, 0, -2 ] );
assert_eq!( v, array![ 2, 0, -2 ] );
Vec<T>
を Array1
に変換
let v: Array1<i16> = Array1::from_vec(vec![ 0, 2, 4, 8 ]);
assert_eq!( v, array![ 0, 2, 4, 8 ] );
イテレータを Array1
に変換
let v: Array1<i16> = Array1::from_iter((0..4).map(|i| 2*i));
assert_eq!( v, array![ 0, 2, 4, 6 ] );
numpy.arange
(float のみ)
let v: Array1<f64> = Array1::range( 4., 8., 2. );
assert_eq!( r, array![ 4., 6. ] );
numpy.linspace
(float のみ)
let v: Array1<f64> = Array1::linspace( 1.57, 3.14, 5 );
assert_eq!( v, array![ 1.57, 1.9625000000000001, 2.355, 2.7475, 3.14 ] );
Dim = 2 (いわゆる行列)
use ndarray::Array2;
としておきます.
単位行列
let a: Array2<i16> = Array2::eye(3);
assert_eq!( a, array![[1, 0, 0],
[0, 1, 0],
[0, 0, 1]] );
成分を直書き
let a: Array2<i16> = arr2( &[[ 0, 2, 4, ],
[ 2, 4, 8, ]] );
assert_eq!( a, array![[ 0, 2, 4, ],
[ 2, 4, 8, ]] );
任意の Dim を持つ Array
を生成するメソッド
use ndarray::Array;
としておきます.
成分がすべてゼロの行列
let t: Array3<i16> = Array::zeros((2,2,3));
assert_eq!( t, array![[[0, 0, 0],
[0, 0, 0],],
[[0, 0, 0],
[0, 0, 0],],] );
成分がすべて 1 の行列
let a: Array2<i16> = Array::ones((2,4));
assert_eq!( a, array![[ 1, 1, 1, 1 ],
[ 1, 1, 1, 1 ]] );
成分がすべて同じ値である行列
let a: Array2<i16> = Array::from_elem((2,4), 8);
assert_eq!( a, array![[ 8, 8, 8, 8 ],
[ 8, 8, 8, 8 ]] );
添え字の関数 (クロージャ) から成分を計算する
let a: Array2<i16> = Array::from_shape_fn((2,4), |(i,j)|{(i+j) as i16});
assert_eq!( a, array![[ 0, 1, 2, 3 ],
[ 1, 2, 3, 4 ]] );
Vec<T>
を欲しい行列の形に並べ直す
let a: Array2<i16> = Array::from_shape_vec((2,4), (0..8).collect::<Vec<i16>>()).unwrap();
assert_eq!( a, array![[ 0, 1, 2, 3 ],
[ 4, 5, 6, 7 ]] );
その他
乱数を用いる場合は ndarray-rand
クレートを用いる (参考) んですが, バージョン 0.9.0 は rand 0.7 をサポートしていません. バージョン 0.10 でサポートするようなのでそれを待ちましょう.