LoginSignup
1
2

More than 5 years have passed since last update.

Array を (左右上下) 反転する 4 つの方法 in Julia

Last updated at Posted at 2016-06-28

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

まず、flipdimflipdim(A, dim) というように引数を取ります。dimaxis のような感じですね。たとえば、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 初心者のため、他にもありましたらご教授ください。

Reference

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2