NumPy配列から不要な行・列を削除!np.delete()の使い方徹底ガイド


 

データ分析や機械学習のプロジェクトでは、データセットから特定の情報を取り除く必要がよくあります。NumPy配列(ndarray)の場合、不要な行や列を削除するのに便利なのが**np.delete()**関数です。この記事では、np.delete()の基本的な使い方から、多次元配列での適用方法、そして使用上の注意点までを詳しく解説します。


 

np.delete()とは?

 

np.delete()は、NumPy配列から指定したインデックスの要素、行、または列を削除し、新しい配列を返す関数です。元の配列は変更されません。これは、データのクリーニングや特徴量選択などの前処理で非常に役立ちます。

 

基本的な要素の削除(一次元配列)

 

まずは、一次元配列から特定の要素を削除する例を見てみましょう。

Python
 
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 を指定します。

Python
 
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 を指定します。

Python
 
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()の代わりにブールインデックス参照を使用する方が効率的な場合があります。特に、特定の条件を満たす行や列を削除したい場合に有効です。

Python
 
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プログラミングが可能になります。