logo

줄리아의 NamedArrays.jl 패키지 📂줄리아

줄리아의 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