NumPy配列を自由自在に反転!np.flip, np.flipud, np.fliplrを徹底解説
データ分析、画像処理、機械学習など、様々な場面でNumPy配列の要素の並び順を反転させたいことがあります。例えば、画像を上下逆さまにしたり、左右を反転させたり、特定の軸に沿ってデータの順序をひっくり返したりするケースです。このようなニーズに応えるのが、NumPyの**np.flip()**, np.flipud(), **np.fliplr()**関数です。この記事では、これらの関数を使ってNumPy配列を効率的に反転させる方法について、具体的なサンプルコードを交えながら詳しく解説します。
NumPy配列の反転とは?
NumPy配列の反転とは、指定した軸(または配列全体)に沿って要素の順序を逆転させる操作です。例えば、[1, 2, 3]を反転させると[3, 2, 1]になります。
これらの関数は、既存のデータを変更するのではなく、反転した新しい配列を返す点に注意してください。
1. 汎用的な反転:np.flip()
np.flip()は、指定した軸(または複数の軸)に沿って配列を反転させる、最も汎用的な関数です。
書式
numpy.flip(m, axis=None)
-
m: 反転させたい入力配列(ndarray)。 -
axis(オプション): 反転を行う軸を指定します。-
None(デフォルト): 配列全体をフラットにした状態で反転します。 -
整数または整数のタプル: 指定された軸(複数可)に沿って反転します。
-
1-1. 1次元配列の反転
サンプルコード
import numpy as np
arr_1d = np.array([10, 20, 30, 40, 50])
print("元の1D配列:", arr_1d)
# 配列全体を反転 (axis=None の場合と同じ)
flipped_1d = np.flip(arr_1d)
print("反転後の1D配列:", flipped_1d)
# 特定の軸(1次元なのでaxis=0)を指定して反転
flipped_1d_axis0 = np.flip(arr_1d, axis=0)
print("axis=0 で反転:", flipped_1d_axis0)
出力例
元の1D配列: [10 20 30 40 50]
反転後の1D配列: [50 40 30 20 10]
axis=0 で反転: [50 40 30 20 10]
1-2. 多次元配列の反転(axisの指定)
axis引数を使うことで、特定の軸(行方向または列方向)に沿って反転できます。
サンプルコード
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("元の2D配列:\n", arr_2d)
# axis=0: 行方向(縦方向)に反転(上下反転)
flipped_axis0 = np.flip(arr_2d, axis=0)
print("\naxis=0 で反転 (上下反転):\n", flipped_axis0)
# axis=1: 列方向(横方向)に反転(左右反転)
flipped_axis1 = np.flip(arr_2d, axis=1)
print("\naxis=1 で反転 (左右反転):\n", flipped_axis1)
# 複数の軸を同時に反転
flipped_both_axes = np.flip(arr_2d, axis=(0, 1))
print("\naxis=(0, 1) で両方向反転:\n", flipped_both_axes)
出力例
元の2D配列:
[[1 2 3]
[4 5 6]
[7 8 9]]
axis=0 で反転 (上下反転):
[[7 8 9]
[4 5 6]
[1 2 3]]
axis=1 で反転 (左右反転):
[[3 2 1]
[6 5 4]
[9 8 7]]
axis=(0, 1) で両方向反転:
[[9 8 7]
[6 5 4]
[3 2 1]]
2. 上下反転に特化:np.flipud()
np.flipud()は、配列の上下を反転させる(行の順序を逆転させる)ための関数です。これはnp.flip(m, axis=0)と全く同じ結果を返します。主に2次元以上の配列(画像など)で使われます。
書式
numpy.flipud(m)
-
m: 上下反転させたい入力配列。
サンプルコード
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("元の2D配列:\n", arr_2d)
# 上下反転
flipped_ud = np.flipud(arr_2d)
print("\n上下反転 (np.flipud):\n", flipped_ud)
出力例
元の2D配列:
[[1 2 3]
[4 5 6]
[7 8 9]]
上下反転 (np.flipud):
[[7 8 9]
[4 5 6]
[1 2 3]]
3. 左右反転に特化:np.fliplr()
np.fliplr()は、配列の左右を反転させる(列の順序を逆転させる)ための関数です。これはnp.flip(m, axis=1)と全く同じ結果を返します。主に2次元以上の配列(画像など)で使われます。
書式
numpy.fliplr(m)
-
m: 左右反転させたい入力配列。
サンプルコード
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("元の2D配列:\n", arr_2d)
# 左右反転
flipped_lr = np.fliplr(arr_2d)
print("\n左右反転 (np.fliplr):\n", flipped_lr)
出力例
元の2D配列:
[[1 2 3]
[4 5 6]
[7 8 9]]
左右反転 (np.fliplr):
[[3 2 1]
[6 5 4]
[9 8 7]]
4. 画像処理での応用例
これらの反転関数は、画像処理において非常に頻繁に利用されます。画像をNumPy配列として読み込めば、これらの関数を直接適用できます。
サンプルコード(画像の上下・左右反転)
import numpy as np
from PIL import Image
# ダミー画像を生成 (青色の300x400画像)
img_np = np.zeros((300, 400, 3), dtype=np.uint8)
img_np[:,:,0] = 255 # 青 (RGB: R=0, G=0, B=255)
# 中央に緑の四角を描画
img_np[100:200, 150:250, 1] = 255 # Green (RGB: R=0, G=255, B=0)
print(f"元の画像配列の形状: {img_np.shape}")
# 画像を上下反転
flipped_ud_img = np.flipud(img_np)
# Pillowで画像として保存
img_pil_ud = Image.fromarray(flipped_ud_img, mode='RGB')
img_pil_ud.save('flipped_ud_image.png')
print("画像を上下反転して 'flipped_ud_image.png' として保存しました。")
# 画像を左右反転
flipped_lr_img = np.fliplr(img_np)
# Pillowで画像として保存
img_pil_lr = Image.fromarray(flipped_lr_img, mode='RGB')
img_pil_lr.save('flipped_lr_image.png')
print("画像を左右反転して 'flipped_lr_image.png' として保存しました。")
まとめ
NumPyの反転関数は、配列の要素の順序を効率的に逆転させるためのシンプルなツールです。
-
np.flip(m, axis=None): 最も汎用的で、指定した軸または配列全体を反転させます。 -
np.flipud(m): 配列の上下を反転させる専用関数(np.flip(m, axis=0)と同じ)。 -
np.fliplr(m): 配列の左右を反転させる専用関数(np.flip(m, axis=1)と同じ)。
これらの関数は、データの整理、画像処理におけるミラーリング効果、機械学習におけるデータ拡張など、多岐にわたる分野で活用されます。NumPyの反転機能を使いこなして、データ操作の幅を広げてください!↩️




