「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Juliaを基礎からゆっくりと(その06/18)

 \mathrm{R}\mathrm{Python}\mathrm{C}言語関係など覚えたいもの、覚えるべきものはたくさんある一方で、注目が集まっているから、やってみたい。ということでプログラミング言語としての\mathrm{Julia}を学んでいく。

2. Juliaの言語機能

2.6 多次元配列

 \mathrm{Julia}には\mathrm{Array\{T,N\}}型という多次元配列が標準で用意されている。ここでTは多次元配列の要素の型を、Nは次元の数を表す。ただし内部的には1次元配列であるため、たとえば長さ12のベクトル(1次元配列)を4\times3行列(2次元配列)に変換することは、値のコピーなく実行できる。
 \mathrm{Julia}の多次元配列はインデックスが1から始まり、要素の順番は列優先である。そのため\mathrm{Julia}の行列で、同じ列の要素を順番に列挙するのは極めて高速である一方で、同じ行の要素を順番に列挙するのはあまり効率的でない。

2.6.1 初期化

 配列の初期化に関する主要な関数は以下のとおりである:

 
関数
概要
  \mathrm{Array\{T\}(undef, dims...)} 値が初期化されていない配列
  \mathrm{zeros(T,dims...)} すべての値が0の配列
  \mathrm{ones(T,dims...)} すべての値が1の配列
  \mathrm{rand(T,dims...)} 一様乱数でランダムに初期化した配列
  \mathrm{randn(T,dims...)} 正規乱数でランダムに初期化した配列
  \mathrm{fill(x,dims...)} すべての値がxの配列
  \mathrm{fill!(A,x)} 配列Aを値xで埋める
  \mathrm{similar(A,T,dims...)} 配列Aと炊事した配列
  \mathrm{reshape(A,dims...)} 配列Aのサイズを変更する
  \mathrm{copy(A)} 配列Aをコピーする
  \mathrm{deepcopy(A)} 配列Aをコピーする

Aの要素も再帰的にコピーする
##################
### 多次元配列 ###
##################

#######
A1 = zeros(Float64,3)
A2 = zeros(Float64,3,3)
A3 = zeros(Int64,3,3,3)

println(A1)
println(A2)
println(A3)
println("")
println("*************")
println("")

#######
B1 = ones(Int64,3,3)
println(B1)
println("")
println("*************")
println("")

#######
C1 = rand(Float64,3,3)
println(C1)
println("")
println("*************")
println("")

#######
D1 = randn(Float64,3,3)
println(D1)
println("")
println("*************")
println("")

#######
E1 = fill(3,3,3)
println(E1)
println("")
println("*************")
println("")

#######
fill!(E1, -1)
println(E1)
println("")
println("*************")
println("")

#######
# Aと同じ型とサイズの配列を返す
F1 = similar(E1,Int64,4,4)
println(F1)
println("")
println("*************")
println("")

#######
G1 = reshape(zeros(Int64,2,2),4) #2×2を4×1に変更
println(G1)
println("")
println("*************")
println("")

#######
H1 = ones(Int64,4,4)
H2 = copy(H1)
H3 = deepcopy(H1)
println(H1)
println(H2)
println(H3)



2.6.2 基本的な操作

 \mathrm{Array}型に関する情報を取得する主要な関数は以下のとおりである:

 
関数
概要
  \mathrm{eltype(A)} Aの要素の型
  \mathrm{length(A)} Aの要素数
  \mathrm{ndims(A)} Aの次元数
  \mathrm{size(A)} Aのサイズ
  \mathrm{size(A,n)} n番目の次元におけるAのサイズ
  \mathrm{strides(A)} Aストライド(要素同士が1次元

配列上でいくつ離れているか)
  \mathrm{stride(A,n)} n番目の次元におけるAストライド
##################
### 多次元配列 ###
##################

### 基本的な操作

A = rand(Float64,3,3)

a1 = eltype(A)
a2 = length(A)
a3 = ndims(A)
a4 = size(A)
a5 = size(A,1)
a6 = strides(A)
a7 = stride(A,1)

println("A:",A)
println("   Aの要素の型:",a1)
println("   Aの要素数:",a2)
println("   Aの次元数:",a3)
println("   Aのサイズ:",a4)
println("   1番目の次元におけるAのサイズ:",a5)
println("   Aのストライド:",a6)
println("   1番目の次元におけるAのストライド:",a7)



2.6.3 インデクシング

 配列の値を取得したり値を代入したりする操作は以下で行う。

############################
### 配列のインデクシング ### 
############################

A = collect(reshape(1:9, 3, 3))

# 値の代入
A[3,3] = -9

println(A)

# 範囲への代入
A[1:2, 1:2] = [-1 -4;-2 -5]

println(A)
2.6.4 多次元配列の演算
 
関数
概要
関数
概要
  \mathrm{A+B} ABの加算 \mathrm{A*c} Aスカラーcの乗算
  \mathrm{A-B} ABの減算 \mathrm{A/B} ABの右除算
  \mathrm{A*B} ABの行列乗算 \mathrm{A}\\mathrm{B} ABの左除算(=A/B)
 
関数
概要
関数
概要
  \mathrm{A.+B} ABの要素同士の加算 \mathrm{A.*B} ABの要素同士の乗算
  \mathrm{A.+c} Acの要素同士の加算 \mathrm{A.*c} Aスカラーcの乗算
  \mathrm{A.-B} ABの要素同士の減算 \mathrm{A./B} ABの要素単位での除算
  \mathrm{A.-c} Acの要素同士の減算 \mathrm{A./c} Aスカラーcの除算
########################
### 多次元配列の演算 ###
########################

using LinearAlgebra

A = 2 * I(3)
B = 0.5 * I(3)
c = 2

res1 = A + B
res2 = A - B
res3 = A * B
res4 = A * c
res5 = A / B
res6 = A \ B # B/Aと等価

println("配列の加算 A+B:",res1)
println("配列の減算 A-B:",res2)
println("配列の行列乗算 A*B:",res3)
println("配列のスカラーとの乗算 A*c:",res4)
println("配列の行列の右除算 :",res5)
println("配列の行列の左除算 :",res6)

println("")
println("**********************************")
println("")

res1 = A .+ B
res2 = A .+ c
res3 = A .- B
res4 = A .- c
res5 = A .* B
res6 = A .* c
res7 = A ./ B
res8 = A ./ c

println("配列の要素単位での加算", res1)
println("配列とスカラーでの加算", res2)
println("配列の要素単位での減算", res3)
println("配列とスカラーでの減算", res4)
println("配列の要素単位での乗算", res5)
println("配列とスカラーでの乗算", res6)
println("配列の要素単位での除算", res7)
println("配列とスカラーでの除算", res8)



プライバシーポリシー お問い合わせ