統計や機械学習に関するプログラミングではPythonやRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaの多次元配列の生成について取りまとめを行いました。
・Julia入門
https://www.hello-statisticians.com/julia
・Julia 1.8 Documentation
https://docs.julialang.org/en/v1/
Contents
多次元配列の生成
zeros・ones関数を用いた多次元配列の生成
zeros関数を用いることで下記のように多次元配列を生成することができます。
x1 = zeros(2,3)
x2 = zeros(Int64,2,3)
println(x1)
println(typeof(x1))
println("===")
println(x2)
println(typeof(x2))・実行結果
[0.0 0.0 0.0; 0.0 0.0 0.0]
Matrix{Float64}
===
[0 0 0; 0 0 0]
Matrix{Int64}同様にones関数を用いることで下記のように多次元配列を生成することができます。
x1 = ones(2,3)
x2 = ones(Int64,2,3)
println(x1)
println(typeof(x1))
println("===")
println(x2)
println(typeof(x2))・実行結果
[1.0 1.0 1.0; 1.0 1.0 1.0]
Matrix{Float64}
===
[1 1 1; 1 1 1]
Matrix{Int64}rand・randn関数を用いた多次元配列の生成
一様分布$U(0,1)$に基づく乱数の生成を行うrand関数を用いた配列の生成は下記のように行うことができます。
using Random
Random.seed!(1234)
x1 = rand(5)
x2 = rand(2,3)
println(x1)
println(x2)・実行結果
[0.32597672886359486, 0.5490511363155669, 0.21858665481883066, 0.8942454282009883, 0.35311164439921205]
[0.39425536741585077 0.7955469475347194 0.7484150218874741; 0.9531246272848422 0.4942498668904206 0.5782319465613976]上記のRandom.seed!(1234)は値の再現ができるように乱数のseedの固定を行いました。同様に標準正規分布$\mathcal{N}(0,1)$に基づく乱数の生成を行うrandn関数を用いた配列の生成は下記のように行うことができます。
using Random
Random.seed!(1234)
x1 = randn(5)
x2 = randn(2,3)
println(x1)
println(x2)・実行結果
[-0.3597289068234817, 1.0872084924285859, -0.4195896169388487, 0.7189099374659392, 0.4202471777937789]
[-0.685670902276119 0.3248927294469157 0.46169497427896844; 2.0547630560640364 -0.30490125519643224 -0.8449577163759787]配列の生成にあたって抑えておくとよい関数
配列の生成にあたって抑えておくと良い関数について下記に取りまとめました。
| 関数 | 概要 |
zeros(T,dims...) | 全ての値が0の配列 |
ones(T,dims | 全ての値が1の配列 |
rand(T,dims | それぞれの要素の値が一様分布に基づく配列 |
randn(T,dims | それぞれの要素の値が標準正規分布に基づく配列 |
fill(x,dims | 全ての値がxの配列 |
上記のTは型、dimsは配列の次元にそれぞれ対応します。型を表すTを省略する場合はFloat64型が適用されることが多く、同様に配列の次元を表すdimsを省略する場合は0次元のスカラー値に対応するサイズが1×1の配列が生成されます。
print(typeof(zeros()))・実行結果
Array{Float64, 0}Juliaの多次元配列の特徴
多次元配列とArray型
Juliaでは多次元配列は基本的にArray{T,N}型で定義されます。Tは要素の型、Nは配列の次元の数にそれぞれ対応します。Vector{T}型やMatrix{T}型も存在する一方でそれぞれArray{T,1}型とArray{T,2}型と同義であることは抑えておくと良いです。
多次元配列のインデックス
Juliaの多次元配列のインデックスは1から始まることに注意が必要です。NumPyでは0から始まるので、Juliaを用いる際に注意が必要です。
column-major order
$$
\large
\begin{align}
A = \left(\begin{array}{ccc} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array} \right)
\end{align}
$$
上記のような配列を定義する際に、決定する必要があるのが要素を並べる順番です。NumPyの多次元配列は$a_{11} \to a_{12} \to a_{13}$のように行から要素を並べるrow-major orderであるのに対し、Juliaでは$a_{11} \to a_{21} \to a_{31}$のように列から要素を並べるcolumu-major orderであることは抑えておくと良いです。row-major orderかcolumu-major orderによって行列が転置されるので、注意が必要です。
参考
・Julia 1.8 Documentation
https://docs.julialang.org/en/v1/
