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

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。今月(2022年10月)からは多忙につき、日々の投稿数を減らします。

MENU

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

 \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.5 ブロードキャスティング

 サイズが異なる配列同士の演算を効率的に実行する仕組みとしてブロードキャスティングがある。ブロードキャスティングができるのは、

  • 配列同士の各次元の大きさが同じ
  • 次元の大きさが異なるものの片方のサイズが1

という条件を満たす場合である。

##############################
### ブロードキャスティング ###
##############################

# 行列のすべての要素に1つの値を作用させる
A = ones(Float64,3,3)
B = ones(Float64,3,3)

println("******************")
println(A + B)
println(A .+ 1) # .+で同じ作用になる
println("******************")

B = ones(Float64, 1, 3)

### ブロードキャストの演算子
# 以下はいずれも同じ
C₁ = A .+ B
C₂ = broadcast(+, A, B)

println("******************")
println(C₁)
println(C₂)
println("******************")

#
sigmoid(x::Float64) = 1.0/(1.0 + exp(-x))

println("******************")
D = sigmoid.(rand(Float64, 3, 3))
println(D)
println("******************")

2.6.6 map, reduce, filter

 配列の各要素に関数を作用させる関数として\mathrm{map,}\mathrm{reduce,}\mathrm{filter}がある。

###########################
### map, reduce, filter ###
###########################

A = rand(3,2)
println(A)
println("**********************")
# map: 各要素を引数として関数を適用する
B = map(x -> x + 1.0, A)
println(B)
println("**********************")

# reduce: 引数に取った配列の全要素を引数として関数を適用する
C₁ = reduce(*, A) # Aの全要素の積を取る

C₂ = 1.0
for i in 1:3
    for j in 1:2
        C₂ *= A[i,j]
    end
end

println(C₁)
println(C₂)
println("**********************")

# 関数を適用した結果を抽出
D₁ = reshape(1:9,(3,3))
D₂ = isodd.(D₁) # 奇数か否か
D₃ = filter(isodd, D₁) # 奇数のみを抽出
println(D₂)
println(D₃)
println("**********************")
2.6.7 サブ配列

 配列の一部を表すのに用いるのがサブ配列である。具体的には\mathrm{view}関数を用いる。参照するのみであるため、巨大な配列から一部を取り出して計算するには、新たな配列を定義するよりも効率的な場合がある。

################
### サブ配列 ###
################

A = rand(Float64,3,3)

B = view(A,1,:)
C = view(A,:,1:2)

println("A=", A)
println("B=", B)
println("C=", C)
プライバシーポリシー お問い合わせ