19
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Rust] ndarray で行列を定義する方法一覧

Posted at

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 でサポートするようなのでそれを待ちましょう.

19
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?