NumPy配列から不要な行・列を削除!np.delete()の使い方徹底ガイド
データ分析や機械学習のプロジェクトでは、データセットから特定の情報を取り除く必要がよくあります。NumPy配列(ndarray)の場合、不要な行や列を削除するのに便利なのが**np.delete()**関数です。この記事では、np.delete()の基本的な使い方から、多次元配列での適用方法、そして使用上の注意点までを詳しく解説します。
np.delete()とは?
np.delete()は、NumPy配列から指定したインデックスの要素、行、または列を削除し、新しい配列を返す関数です。元の配列は変更されません。これは、データのクリーニングや特徴量選択などの前処理で非常に役立ちます。
基本的な要素の削除(一次元配列)
まずは、一次元配列から特定の要素を削除する例を見てみましょう。
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
# インデックス2の要素(値30)を削除
new_arr = np.delete(arr, 2)
print(f"元の配列: {arr}") # 出力: 元の配列: [10 20 30 40 50]
print(f"削除後の配列: {new_arr}") # 出力: 削除後の配列: [10 20 40 50]
# 複数のインデックスの要素を削除
multiple_deleted_arr = np.delete(arr, [0, 4]) # インデックス0と4を削除
print(f"複数削除後の配列: {multiple_deleted_arr}") # 出力: 複数削除後の配列: [20 30 40]
np.delete()は、第1引数に配列、第2引数に削除したい要素のインデックス(単一またはリスト)、そして第3引数にaxisを指定します。一次元配列の場合、axisは指定しなくても構いません。
多次元配列からの行・列の削除
np.delete()は、axis引数を指定することで、多次元配列から特定の行または列を削除できます。
行の削除(axis=0)
配列から特定の行を削除するには、axis=0 を指定します。
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 1行目(インデックス1)を削除
deleted_row_arr = np.delete(arr_2d, 1, axis=0)
print(f"行削除後の配列:\n{deleted_row_arr}")
# 出力:
# [[1 2 3]
# [7 8 9]]
# 複数行の削除
deleted_multi_row_arr = np.delete(arr_2d, [0, 2], axis=0) # 0行目と2行目を削除
print(f"複数行削除後の配列:\n{deleted_multi_row_arr}")
# 出力:
# [[4 5 6]]
列の削除(axis=1)
配列から特定の列を削除するには、axis=1 を指定します。
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 2列目(インデックス1)を削除
deleted_col_arr = np.delete(arr_2d, 1, axis=1)
print(f"列削除後の配列:\n{deleted_col_arr}")
# 出力:
# [[1 3]
# [4 6]
# [7 9]]
# 複数列の削除
deleted_multi_col_arr = np.delete(arr_2d, [0, 2], axis=1) # 0列目と2列目を削除
print(f"複数列削除後の配列:\n{deleted_multi_col_arr}")
# 出力:
# [[2]
# [5]
# [8]]
np.delete()の注意点と代替方法
np.delete()は非常に便利ですが、使用する際にはいくつかの注意点があります。
1. 新しい配列が生成される
前述の通り、np.delete()は元の配列を変更せず、常に新しい配列を生成します。そのため、特に大きな配列を頻繁に削除する場合、メモリ使用量と処理速度に影響が出る可能性があります。
2. パフォーマンスに関する考慮
大規模な配列から多くの要素を削除する場合、np.delete()は効率的でないことがあります。これは、削除するたびにデータのコピーが発生するためです。
3. より効率的な代替案(ブールインデックス参照など)
パフォーマンスが重要な場面では、np.delete()の代わりにブールインデックス参照を使用する方が効率的な場合があります。特に、特定の条件を満たす行や列を削除したい場合に有効です。
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 例えば、1行目(インデックス1)を削除したい場合
# 削除したい行以外のインデックスを選択
rows_to_keep = np.array([True, False, True]) # 1行目以外を保持
filtered_arr = arr_2d[rows_to_keep, :]
print(f"ブールインデックスで削除後の配列:\n{filtered_arr}")
# 出力:
# [[1 2 3]
# [7 8 9]]
# または、インデックス番号で直接指定
rows_to_keep_idx = [0, 2]
filtered_arr_idx = arr_2d[rows_to_keep_idx, :]
print(f"インデックス指定で削除後の配列:\n{filtered_arr_idx}")
# 出力:
# [[1 2 3]
# [7 8 9]]
この方法は、削除したい要素が少数の場合はnp.delete()で十分ですが、大量の削除や条件に基づく削除を行う場合は、ブールインデックス参照の方が効率的になることが多いです。
まとめ
np.delete()は、NumPy配列から不要な要素、行、または列を簡単に削除できる非常に便利な関数です。特に、配列の形状を柔軟に調整したいデータ前処理のステップで活躍します。ただし、新しい配列が生成される点や、大規模データに対するパフォーマンスを考慮し、場合によってはブールインデックス参照などの代替手段も検討することで、より効率的なNumPyプログラミングが可能になります。

