ジュリアのNamedArrays.jlパッケージ
説明
JuliaのNamedArrays.jl
は、2次元配列を使用する際に行と列に名前を付けて使用できるパッケージです。もちろん、3次元以上でも使用可能ですが、この記事では2次元配列に焦点を当てて説明します。
コード
定義
$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, ["最初の行の名前", "2番目の行の名前"...], 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
はデータフレームに似ていますが、何と言っても AbstractArray
のサブタイプであるということが最大の特徴です。したがって、データフレームとは異なり演算が可能です。同じサイズの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
┌ Warning: Using names of left argument
└ @ NamedArrays C:\Users\rydbr\.julia\packages\NamedArrays\73Upr\src\arithmetic.jl:25
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
┌ Warning: Using names of left argument
└ @ NamedArrays C:\Users\rydbr\.julia\packages\NamedArrays\73Upr\src\arithmetic.jl:25
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