Julia では、Python (NumPy) にあるような [::-1]
のようなスライス表記をつかうことができません。データの可視化などをする際の多次元配列の整形操作に便利な関数などをまとめてみます。(多分、ただの僕の備忘録になりそうです笑)
flipdim
関数
flipdim
という関数で、左右上下を反転することができます。反転しているのがわかりやすいように次のような行列を作っておきます。
A = begin
A = eye(3)
for i in 1:3
A[i, :] *= i
end
A
end
@show A
# 3x3 Array{Float64,2}:
# 1.0 0.0 0.0
# 0.0 2.0 0.0
# 0.0 0.0 3.0
まず、flipdim
は flipdim(A, dim)
というように引数を取ります。dim
は axis
のような感じですね。たとえば、dim = 1
とすると、次のように上下反転します。
flipdim(A, 1)
# 3x3 Array{Float64,2}:
# 0.0 0.0 3.0
# 0.0 2.0 0.0
# 1.0 0.0 0.0
また、dim = 2
なら左右反転です。
flipdim(A, 2)
# 3x3 Array{Float64,2}:
# 0.0 0.0 1.0
# 0.0 2.0 0.0
# 3.0 0.0 0.0
circshift
関数
circshift
というのもあります。これは circshift(A, shifts)
のように使います。shifts
にしたがって軸をとり、回転させるような変形をします。(迷名: トイレットペーパーシフト)
shifts
にはシーケンスを代入しますが、Int の場合には、行方向に軸をとって回転します。値の大きさによってどれくらい回すか(シフトさせるか)のステップ数を指定できます。
circshift(A, 1)
# 3x3 Array{Float64,2}:
# 0.0 0.0 3.0
# 1.0 0.0 0.0
# 0.0 2.0 0.0
負値にすると、逆方向に回ります。
circshift(A, -1)
# 3x3 Array{Float64,2}:
# 0.0 2.0 0.0
# 0.0 0.0 3.0
# 1.0 0.0 0.0
shifts = [0, 1]
にすれば、軸ごとにどれくらい回すか指定できます。
circshift(A, [0, 1])
# 3x3 Array{Float64,2}:
# 0.0 1.0 0.0
# 0.0 0.0 2.0
# 3.0 0.0 0.0
転置
Julia では、A'
のように '
をつけることで、 転置させることができます。対角行列では転置がわからないので、randn
で適当に乱数行列を作ります。
srand(100) # set seed
X = randn(2, 2)
# 2x2 Array{Float64,2}:
# -0.658136 -0.601421
# 0.383753 -0.211517
では、転置させてみます。
X'
# 2x2 Array{Float64,2}:
# -0.658136 0.383753
# -0.601421 -0.211517
ちゃんと転置できていますね。
範囲 (Range) でどうにかする
範囲を使うことで、どうにかすることも可能です。
srand(100)
Y = randn(3, 3)
# 3x3 Array{Float64,2}:
# -0.658136 -0.211517 0.396071
# 0.383753 1.57874 -0.870703
# -0.601421 2.03256 -0.705681
これについて、flipdim
を使わずに範囲だけで上下反転させます。
Y[end:-1:1, :]
# 3x3 Array{Float64,2}:
# -0.601421 2.03256 -0.705681
# 0.383753 1.57874 -0.870703
# -0.658136 -0.211517 0.396071
できました。end
とステップをつかうことで、反転させることは割と簡単にできます。@time
マクロでみるとわかるように、範囲で反転させるほうが flipdim
より早く、アロケーションも少ないようです。
また、以下で点対称に反転できます。
@time Y[end:-1:1, end:-1:1]
# 0.000009 seconds (12 allocations: 528 bytes)
# 3x3 Array{Float64,2}:
# -0.705681 2.03256 -0.601421
# -0.870703 1.57874 0.383753
# 0.396071 -0.211517 -0.658136
# is equivalent to
@time flipdim(flipdim(Y, 1), 2)
# 0.000031 seconds (51 allocations: 1.750 KB)
# 3x3 Array{Float64,2}:
# -0.705681 2.03256 -0.601421
# -0.870703 1.57874 0.383753
# 0.396071 -0.211517 -0.658136
以上で、Julia における配列の整形操作まとめを終わります。Julia 初心者のため、他にもありましたらご教授ください。