pandasデータフレームにおけるshift操作のようなものを行いたくて調べたのでそのメモです。
numpyか、aryにshiftメソッドがあると勝手に決めつけていたのですが実際は無く、代わりにnumpy.rollというのを使います。
ドキュメント: numpy.roll
元々行いたかったのは、配列の要素を左右(2多次元配列の場合はそれぞれの軸方向にも)ずらして、欠損値になるところにはNoneか何か入るイメージだったのですが、
numpy.rollを使うと、名前の通り、回転させるような動きをします。
(例を見る方がわかりやすいです)
numpy.rollは次の引数を取ります。
a: 回転させる配列
shift: 回転させる幅 (値かタプル)
axis: 回転させる方向 (値かタプル。デフォルトはNone)
まず、1次元配列でやってみます。 1次元しかないのでaxisは意味がなく、shift幅だけ指定してます。
import numpy as np
# 元のデータ作成
ary1 = np.arange(7)
print(ary1)
# [0 1 2 3 4 5 6]
print(np.roll(ary1, 2))
# [5 6 0 1 2 3 4]
print(np.roll(ary1, -3))
# [3 4 5 6 0 1 2]
左右が繋がって回転してるようにずれていますね。
次に2次元です。
axisが未指定(もしくはNoneを渡す)場合と、それぞれの軸の方向を指定した場合で挙動が違うのでやってみます。
ary2 = np.arange(30).reshape(5, 6)
print(ary2)
"""
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
"""
# axis未指定で、行列全体で回転。左上と右下が繋がる。
print(np.roll(ary2, 2))
"""
[[28 29 0 1 2 3]
[ 4 5 6 7 8 9]
[10 11 12 13 14 15]
[16 17 18 19 20 21]
[22 23 24 25 26 27]]
"""
# axis=1 で行ごとに回転。
print(np.roll(ary2, 2, axis=1))
"""
[[ 4 5 0 1 2 3]
[10 11 6 7 8 9]
[16 17 12 13 14 15]
[22 23 18 19 20 21]
[28 29 24 25 26 27]]
"""
# axis=0 で列ごとに回転。
print(np.roll(ary2, 2, axis=0))
"""
[[18 19 20 21 22 23]
[24 25 26 27 28 29]
[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]]
"""