줄리아의 NamedArrays.jl 패키지
설명
줄리아의 NamedArrays.jl
은 2차원 배열을 사용할 때 행과 열에 이름을 붙여서 사용할 수 있게 해주는 패키지이다. 물론 3차원 이상에서도 사용할 수는 있으나, 본 글에서는 2차원 배열에 집중해서 설명하겠다.
에러 테이블 같은 거 출력할 때 유용하다. println
써가면서 예쁘게 출력하려고 삽질하지 않아도 된다.
2×2 Named Matrix{Float32}
A ╲ B │ w/o noise w/ noise
────┼───────────
Type 1 │ 0.0593505 0.0834334
Type 2 │ 0.0619154 0.08051
코드
정의
$3 \times 4$ 크기의 배열을 함수 NamedArray
에 입력하면 행과 열에 이름을 붙여서 출력해준다.
julia> using NamedArrays
julia> X = reshape(1:12, (3, 4))
3×4 reshape(::UnitRange{Int64}, 3, 4) with eltype Int64:
1 4 7 10
2 5 8 11
3 6 9 12
julia> A = NamedArray(X)
3×4 Named Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}
A ╲ B │ 1 2 3 4
-───┼───────-
1 │ 1 4 7 10
2 │ 2 5 8 11
3 │ 3 6 9 12
타입을 지정하고 튜플을 입력하면 랜덤 배열을 반환한다.
julia> NamedArray{Float64}(2,2)
2×2 Named Matrix{Float64}
A ╲ B │ 1 2
-───┼─────────-
1 │ 0.0 1.0e-323
2 │ 5.0e-324 1.5e-323
julia> NamedArray{Int16}(2,2)
2×2 Named Matrix{Int16}
A ╲ B │ 1 2
-───┼───────-
1 │ 30352 616
2 │ -13498 0
julia> NamedArray{Char}(2,2)
2×2 Named Matrix{Char}
A ╲ B │ 1 2
-───┼───────────────────-
1 │ '\x00\x00\x00\x9d' '\x00\x00\x00\x12'
2 │ '\0' '\0'
이름
첫번째 차원(행)에 이름을 붙이고 싶다면 setnames!(A, ["첫번째 행 이름", "두번째 행 이름"...], 1)
과 같이 입력한다.
julia> setnames!(A, ["1행", "2행", "3행"], 1)
(OrderedCollections.OrderedDict{Any, Int64}("1행" => 1, "2행" => 2, "3행" => 3), OrderedCollections.OrderedDict{Any, Int64}("1" => 1, "2" => 2, "3" => 3, "4" => 4))
julia> A
3×4 Named Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}
A ╲ B │ 1 2 3 4
-───┼───────-
1행 │ 1 4 7 10
2행 │ 2 5 8 11
3행 │ 3 6 9 12
julia> setnames!(A, ["가", "나", "다", "라"], 2)
(OrderedCollections.OrderedDict{Any, Int64}("1행" => 1, "2행" => 2, "3행" => 3), OrderedCollections.OrderedDict{Any, Int64}("가" => 1, "나" => 2, "다" => 3, "라" => 4))
julia> A
3×4 Named Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}
A ╲ B │ 가 나 다 라
-───┼───────-
1행 │ 1 4 7 10
2행 │ 2 5 8 11
3행 │ 3 6 9 12
혹은 다음과 같이 정의할 때 입력할 수도 있다.
julia> NamedArray(X, (["1행", "2행", "3행"], ["가", "나", "다", "라"]))
3×4 Named Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}
A ╲ B │ 가 나 다 라
-───┼───────-
1행 │ 1 4 7 10
2행 │ 2 5 8 11
3행 │ 3 6 9 12
julia> NamedArray(X, (["1행", "2행", "3행"], ["가", "나", "다", "라"]), ("Rows", "Cols"))
3×4 Named Base.ReshapedArray{Int64, 2, UnitRange{Int64}, Tuple{}}
Rows ╲ Cols │ 가 나 다 라
-──────┼───────-
1행 │ 1 4 7 10
2행 │ 2 5 8 11
3행 │ 3 6 9 12
인덱싱과 슬라이싱
행이나 열의 이름을 인덱싱, 슬라이싱할 때 사용할 수 있다.
julia> A["1행", "나"]
4
julia> A["1행", 2]
4
julia> A["2행", :]
4-element Named Vector{Int64}
B │
-─┼──
가 │ 2
나 │ 5
다 │ 8
라 │ 11
julia> A[["1행", "2행", "3행"], "다"]
3-element Named Vector{Int64}
A │
──┼──
1행 │ 7
2행 │ 8
3행 │ 9
연산
NamedArray
는 데이터 프레임과 비슷하게 생겼지만, 어쨌든 AbstracytArray
의 서브타입이라는 것이 가장 큰 특징이다. 따라서 데이터 프레임과는 다르게 연산을 할 수 있다. 같은 크기의 NamedArray를 더할 때 행과 열의 이름이 맞지 않으면 왼쪽 배열의 이름을 기준으로 한다.
julia> supertype(NamedArray)
AbstractArray
julia> B = NamedArray(ones(3,4), [["a", "b", "c"], ["A", "B", "C", "D"]])
3×4 Named Matrix{Float64}
A ╲ B │ A B C D
-───┼──────────
a │ 1.0 1.0 1.0 1.0
b │ 1.0 1.0 1.0 1.0
c │ 1.0 1.0 1.0 1.0
julia> C = NamedArray(2ones(3,4))
3×4 Named Matrix{Float64}
A ╲ B │ 1 2 3 4
-───┼──────────
1 │ 2.0 2.0 2.0 2.0
2 │ 2.0 2.0 2.0 2.0
3 │ 2.0 2.0 2.0 2.0
julia> B+C
3×4 Named Matrix{Float64}
A ╲ B │ A B C D
-───┼──────────
a │ 3.0 3.0 3.0 3.0
b │ 3.0 3.0 3.0 3.0
c │ 3.0 3.0 3.0 3.0
julia> C+B
3×4 Named Matrix{Float64}
A ╲ B │ 1 2 3 4
-───┼──────────
1 │ 3.0 3.0 3.0 3.0
2 │ 3.0 3.0 3.0 3.0
3 │ 3.0 3.0 3.0 3.0
곱의 경우 이름이 상식적으로 지정된다.
julia> B*C'
3×3 Named Matrix{Float64}
A ╲ A │ 1 2 3
-───┼───────
a │ 8.0 8.0 8.0
b │ 8.0 8.0 8.0
c │ 8.0 8.0 8.0
julia> C' * B
4×4 Named Matrix{Float64}
B ╲ B │ A B C D
-───┼─────────-
1 │ 6.0 6.0 6.0 6.0
2 │ 6.0 6.0 6.0 6.0
3 │ 6.0 6.0 6.0 6.0
4 │ 6.0 6.0 6.0 6.0
환경
- OS: Windows11
- Version: Julia 1.10.0, NamedArrays v0.10.1