Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@osanshouo

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

More than 1 year has passed since last update.

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

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?