NumPy配列をスマートに回転!np.rot90でデータ操作を効率化
データ分析、画像処理、シミュレーションなど、さまざまな分野でNumPy配列のデータを回転させたい場面があります。特に、画像を90度単位で回転させたり、行列を回転させて新しい視点から分析したりするケースです。このようなニーズに応えるのが、NumPyの**np.rot90()関数です。この記事では、np.rot90()を使ってNumPy配列を効率的に90度単位で回転させる方法**について、具体的なサンプルコードを交えながら詳しく解説します。
np.rot90()とは?
np.rot90()は、NumPy配列を反時計回りに90度単位で回転させる関数です。特に2次元配列(行列や画像)の回転に便利です。配列の形状が変わることに注意が必要です(例: 幅と高さが入れ替わる)。
書式
numpy.rot90(m, k=1, axes=(0, 1))
-
m: 回転させたい入力配列(ndarray)。2次元以上の配列である必要があります。 -
k(オプション): 回転させる回数(90度単位)。-
正の値: 反時計回りに度回転。
-
負の値: 時計回りに$|k| \times 90$度回転。
-
デフォルトは
1(90度反時計回り)。
-
-
axes(オプション): 回転を実行する2つの軸を指定するタプル。-
デフォルトは
(0, 1)で、最初の2つの軸(行と列)に沿って回転します。 -
画像の回転では通常このままで問題ありません。
-
1. 2次元配列の回転
最も一般的な使い方は、2次元配列(行列)を90度単位で回転させる場合です。
サンプルコード
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("元の配列:\n", arr_2d)
print("元の形状:", arr_2d.shape)
# 反時計回りに90度回転 (k=1)
rotated_90 = np.rot90(arr_2d, k=1)
print("\n90度回転:\n", rotated_90)
print("形状:", rotated_90.shape)
# 反時計回りに180度回転 (k=2)
rotated_180 = np.rot90(arr_2d, k=2)
print("\n180度回転:\n", rotated_180)
print("形状:", rotated_180.shape)
# 時計回りに90度回転 (k=-1)
rotated_neg90 = np.rot90(arr_2d, k=-1)
print("\n-90度 (時計回り90度) 回転:\n", rotated_neg90)
print("形状:", rotated_neg90.shape)
出力例
元の配列:
[[1 2 3]
[4 5 6]
[7 8 9]]
元の形状: (3, 3)
90度回転:
[[3 6 9]
[2 5 8]
[1 4 7]]
形状: (3, 3)
180度回転:
[[9 8 7]
[6 5 4]
[3 2 1]]
形状: (3, 3)
-90度 (時計回り90度) 回転:
[[7 4 1]
[8 5 2]
[9 6 3]]
形状: (3, 3)
2. 長方形配列の回転
正方行列だけでなく、長方形の配列も回転できます。この場合、回転によって配列の形状(幅と高さ)が入れ替わることに注意してください。
サンプルコード
import numpy as np
rect_arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8]])
print("元の長方形配列:\n", rect_arr)
print("元の形状:", rect_arr.shape) # (2, 4)
# 90度回転
rotated_rect = np.rot90(rect_arr, k=1)
print("\n90度回転後の長方形配列:\n", rotated_rect)
print("形状:", rotated_rect.shape) # (4, 2)
出力例
元の長方形配列:
[[1 2 3 4]
[5 6 7 8]]
元の形状: (2, 4)
90度回転後の長方形配列:
[[4 8]
[3 7]
[2 6]
[1 5]]
形状: (4, 2)
3. 画像処理での応用例
np.rot90()は、画像を回転させる際にも非常に便利です。カラー画像の場合、形状は通常(高さ, 幅, チャンネル数)となりますが、np.rot90()はデフォルトで最初の2つの軸(高さと幅)を回転させるため、そのまま適用できます。
サンプルコード(カラー画像の回転)
import numpy as np
from PIL import Image
# ダミー画像を生成 (青色の200x300画像)
# NumPy配列は (高さ, 幅, チャンネル数)
img_np = np.zeros((200, 300, 3), dtype=np.uint8)
img_np[:,:,0] = 255 # 青 (RGB: R=0, G=0, B=255)
# 中央に緑の四角を描画
img_np[50:150, 100:200, 1] = 255 # Green (RGB: R=0, G=255, B=0)
print(f"元の画像配列の形状: {img_np.shape}")
# 画像を反時計回りに90度回転
# k=1 (デフォルト)
rotated_img_np = np.rot90(img_np)
print(f"90度回転後の画像配列の形状: {rotated_img_np.shape}")
# Pillowで画像として保存
img_pil = Image.fromarray(rotated_img_np, mode='RGB')
img_pil.save('rotated_image.png')
print("回転した画像を 'rotated_image.png' として保存しました。")
4. 3次元配列(複数軸の指定)
axes引数を変更することで、2次元以上の配列の任意の2つの軸に沿って回転を実行することも可能です。
サンプルコード
import numpy as np
# 3D配列 (例: (Z軸, Y軸, X軸))
arr_3d = np.arange(2 * 3 * 4).reshape(2, 3, 4)
print("元の3D配列の形状:", arr_3d.shape) # (2, 3, 4)
# 軸1と軸2 (Y軸とX軸) に沿って回転
# 結果的に、各"層"が回転する
rotated_3d = np.rot90(arr_3d, k=1, axes=(1, 2))
print("\n軸1と軸2で90度回転後の形状:", rotated_3d.shape) # (2, 4, 3)
出力例
元の3D配列の形状: (2, 3, 4)
軸1と軸2で90度回転後の形状: (2, 4, 3)
まとめ
NumPyのnp.rot90()関数は、配列を90度単位で簡単に回転させるための効率的なツールです。
-
用途: 行列の変換、画像の回転、データの前処理など。
-
回転方向と角度:
k引数で、反時計回り(正の値)または時計回り(負の値)に90度、180度、270度などの回転を指定できます。 -
多次元配列: デフォルトでは最初の2つの軸を回転させますが、
axes引数で任意の2つの軸を指定して回転することも可能です。 -
形状の変化: 長方形の配列を回転させる場合、形状の幅と高さが入れ替わります。
np.rot90()を使いこなすことで、配列の向きを柔軟に調整し、データ処理の幅を広げることができるでしょう。ぜひ、あなたのNumPyワークフローに取り入れてみてください!🔄



