줄리아에서 2차원 배열과 행렬 간 전환하는 법
개요
줄리아에서 2차원 배열과 행렬 사이를 전환하는 팁을 소개한다1. 아마 줄리아 1.7 이하의 환경에서는 가장 줄리아다운 구현이면서 간단하고, 빠르고, 아름다운 방법일 것이다.
코드
여기서 소개된 방법이 아니라도 행렬과 2차원 배열을 넘나드는 방법은 무수히 많다. 막코딩을 하든 뭘하든 목표자체가 어렵지 않기 때문이다. 글을 제대로 읽으려면 단순히 목표만 신경쓸 게 아니라 줄리아 특유의 문법이 어떻게 쓰였는지를 고민하면서 보는 게 좋다.
행렬을 2차원배열로
julia> M = rand(0:9, 3, 10)
3×10 Matrix{Int64}:
2 4 0 1 8 0 9 2 5 7
5 2 1 5 4 3 7 2 7 3
7 8 1 9 0 3 2 4 1 3
위와 같은 행렬을 2차원 배열로 바꿔보자.
julia> [eachrow(M)...]
3-element Vector{SubArray{Int64, 1, Matrix{Int64}, Tuple{Int64, Base.Slice{Base.OneTo{Int64}}}, true}}:
[2, 4, 0, 1, 8, 0, 9, 2, 5, 7]
[5, 2, 1, 5, 4, 3, 7, 2, 7, 3]
[7, 8, 1, 9, 0, 3, 2, 4, 1, 3]
julia> [eachcol(M)...]
10-element Vector{SubArray{Int64, 1, Matrix{Int64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}}:
[2, 5, 7]
[4, 2, 8]
[0, 1, 1]
[1, 5, 9]
[8, 4, 0]
[0, 3, 3]
[9, 7, 2]
[2, 2, 4]
[5, 7, 1]
[7, 3, 3]
eachrow()
와 eachcol()
는 행렬의 행과 열 단위로 한 줄씩 뽑아주는 생성자generator를 리턴하고2 스플랫 오퍼레이터를 통해 이들을 가변 배열로 취급해서3 각괄호 []
안에 넣어주면 자연스럽게 배열이 된다.
2차원배열을 행렬로
julia> A = [rand(0:9,3) for _ in 1:10]
10-element Vector{Vector{Int64}}:
[5, 4, 9]
[9, 7, 6]
[9, 9, 6]
[5, 9, 0]
[0, 2, 8]
[3, 9, 5]
[1, 6, 0]
[5, 7, 7]
[1, 3, 5]
[5, 4, 1]
위와 같은 2차원 배열을 행렬로 만들어보자.
julia> hcat(A...)
3×10 Matrix{Int64}:
5 9 9 5 0 3 1 5 1 5
4 7 9 9 2 9 6 7 3 4
9 6 6 0 8 5 0 7 5 1
julia> hcat(A...)'
10×3 adjoint(::Matrix{Int64}) with eltype Int64:
5 4 9
9 7 6
9 9 6
5 9 0
0 2 8
3 9 5
1 6 0
5 7 7
1 3 5
5 4 1
julia> vcat(A...)
30-element Vector{Int64}:
5
4
9
9
7
6
9
9
⋮
7
1
3
5
5
4
1
배열을 병합하는 hcat()
함수를 사용하면 된다4. 기본적으로 hcat()
과 vcat()
은 폴드 함수이면서 가변 인자 함수기 때문에 마찬가지로 스플랫 오퍼레이터를 통해 2차원 배열의 원소인 1차원 배열들을 직접 인자로써 전달해야한다.
전체 코드
# matrix to 2d array
M = rand(0:9, 3, 10)
[eachrow(M)...]
[eachcol(M)...]
# 2d array to matrix
A = [rand(0:9,3) for _ in 1:10]
hcat(A...)
hcat(A...)'
vcat(A...)
환경
- OS: Windows
- julia: v1.7.0