ある配列をシフトしたい、つまり、ある行列があった場合、n列目やm行目をx列目やy行目にずらしたいとき
Pythonでは、Numpyモジュールのrollでシフトすることができます。
1次元
1次元をシフトしたい場合、以下のように記述します。
import numpy as np
array = np.array([1,2,3,4,5,6,7,8,9])
print(array)
roll_array = np.roll(array,1)
print(roll_array)
[1 2 3 4 5 6 7 8 9]
[9 1 2 3 4 5 6 7 8]
要素が右にシフトしました。
左にシフトしたい場合、2つ目の引数を負にすればいいです。
import numpy as np
array = np.array([1,2,3,4,5,6,7,8,9])
print(array)
roll_array = np.roll(array,-1)
print(roll_array)
[1 2 3 4 5 6 7 8 9]
[2 3 4 5 6 7 8 9 1]
Numpyモジュールを用いるため、最初にimportしてあげましょう。
2次元
2次元配列の場合、要素をずらす場合と行、列自身を軸としてずらす2つのパターンがあります。
要素をずらす場合は、以下のように記述します。
import numpy as np
array = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
print(array)
roll_array = np.roll(array,1)
print(roll_array)
[[1 2 3]
[4 5 6]
[7 8 9]]
[[9 1 2]
[3 4 5]
[6 7 8]]
上にシフト
行、列を軸としてずらす場合、3つ目の引数(axis)に値を入れる必要があります。
import numpy as np
array = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
print(array)
roll_array = np.roll(array,-1,axis=0)
print(roll_array)
[[1 2 3]
[4 5 6]
[7 8 9]]
[[4 5 6]
[7 8 9]
[1 2 3]]
下にシフト
import numpy as np
array = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
print(array)
roll_array = np.roll(array,1,axis=0)
print(roll_array)
[[1 2 3]
[4 5 6]
[7 8 9]]
[[7 8 9]
[1 2 3]
[4 5 6]]
左にシフト
import numpy as np
array = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
print(array)
roll_array = np.roll(array,-1,axis=1)
print(roll_array)
[[1 2 3]
[4 5 6]
[7 8 9]]
[[2 3 1]
[5 6 4]
[8 9 7]]
右にシフト
import numpy as np
array = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
print(array)
roll_array = np.roll(array,1,axis=1)
print(roll_array)
[[1 2 3]
[4 5 6]
[7 8 9]]
[[3 1 2]
[6 4 5]
[9 7 8]]
3次元以上でも同様に動かすことができます。
まとめ
#1次元,2次元(要素)
num > 0 : 右にシフト
num < 0 : 左にシフト
np.roll(array,num)
#2次元(軸に沿って)
num > 0 && dim = 0 : 下にシフト
num < 0 && dim = 0 : 上にシフト
num > 0 && dim = 1 : 右にシフト
num < 0 && dim = 1 : 左にシフト
np.roll(array,num,axis=dim)