NumPy配列の要素を自在に操る!条件による抽出・削除テクニック


 

NumPyを扱う上で、特定の条件を満たす要素だけを選び出したり、不要な要素や行・列を削除したりする操作は日常茶飯事です。これらの操作を効率的に行うためのNumPyの強力な機能を知ることで、データハンドリングの幅が格段に広がります。この記事では、NumPy配列(ndarray)から条件を満たす要素、行、列を抽出・削除する方法について、具体的なコード例を交えながら詳しく解説します。


 

条件による要素の抽出(ブールインデックス参照)

 

NumPyでは、条件式によって生成された真偽値の配列(ブール配列)を使って、元の配列から条件を満たす要素を直接抽出できます。これを「ブールインデックス参照(Boolean Indexing)」と呼びます。

 

1. 1次元配列からの抽出

 

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([10, -5, 20, -15, 30])

# 0より大きい要素を抽出
positive_elements = arr[arr > 0]
print("0より大きい要素:", positive_elements)

 

出力例

 

0より大きい要素: [10 20 30]

 

2. 多次元配列からの抽出

 

多次元配列の場合も同様にブールインデックス参照を使用できますが、結果は常に1次元配列になります。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 5より大きい要素を抽出
greater_than_5 = arr_2d[arr_2d > 5]
print("5より大きい要素:", greater_than_5)

 

出力例

 

5より大きい要素: [6 7 8 9]

 

条件による行・列の抽出

 

ブールインデックス参照は、行や列の抽出にも応用できます。

 

1. 条件を満たす行の抽出

 

特定の条件を満たす行全体を抽出したい場合は、軸を指定してブールインデックス参照を行います。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[10, 20, 30],
                   [4, 5, 6],
                   [70, 80, 90]])

# 最初の列の要素が50以上の行を抽出
rows_cond = arr_2d[:, 0] >= 50
extracted_rows = arr_2d[rows_cond]
print("最初の列が50以上の行:\n", extracted_rows)

 

出力例

 

最初の列が50以上の行:
 [[10 20 30]
 [70 80 90]]

 

2. 条件を満たす列の抽出

 

列を抽出する場合も、同様に軸を指定します。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[1, 10, 100],
                   [2, 20, 200],
                   [3, 30, 300]])

# 最初の行の要素が50以上の列を抽出
cols_cond = arr_2d[0, :] >= 50
extracted_cols = arr_2d[:, cols_cond]
print("最初の行が50以上の列:\n", extracted_cols)

 

出力例

 

最初の行が50以上の列:
 [[100]
 [200]
 [300]]

 

条件による要素・行・列の削除

 

NumPyには、条件に基づいて要素を直接「削除」する専用の関数は少ないですが、ブールインデックス参照を使って「残したい要素を選択する」ことで実質的に削除と同じ効果を得られます。また、np.delete関数も利用できます。

 

1. 特定の要素の削除(実質的な抽出)

 

条件を満たさない要素を抽出することで、条件を満たす要素を「削除」した配列を作成できます。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6])

# 3より大きい要素を「削除」する(3以下の要素を抽出する)
arr_deleted = arr[arr <= 3]
print("3より大きい要素を削除した配列:", arr_deleted)

 

出力例

 

3より大きい要素を削除した配列: [1 2 3]

 

2. 特定の行・列の削除(np.deleteとブールインデックス)

 

np.deleteはインデックスを指定して削除する関数ですが、条件と組み合わせて使うこともできます。より直感的なのは、ブールインデックス参照で残したい行/列を選ぶ方法です。

 

np.deleteを使った行・列の削除

 

np.deleteは、指定したインデックスの要素、行、または列を削除した新しい配列を返します。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 1番目の行(インデックス1)を削除
deleted_row = np.delete(arr_2d, 1, axis=0)
print("1番目の行を削除:\n", deleted_row)

# 0番目の列(インデックス0)を削除
deleted_col = np.delete(arr_2d, 0, axis=1)
print("\n0番目の列を削除:\n", deleted_col)

 

出力例

 

1番目の行を削除:
 [[1 2 3]
 [7 8 9]]

0番目の列を削除:
 [[2 3]
 [5 6]
 [8 9]]

 

ブールインデックス参照を使った行・列の削除(残す要素を選ぶ)

 

特定の条件を満たす行や列を「削除」したい場合、その条件を満たさない行や列を選択することで実現できます。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[10, 20, 30],
                   [4, 5, 6],
                   [70, 80, 90]])

# 最初の列の要素が50未満の行を抽出(つまり50以上の行を削除)
rows_to_keep = arr_2d[:, 0] < 50
result_rows = arr_2d[rows_to_keep]
print("最初の列が50未満の行を抽出(50以上の行を削除):\n", result_rows)

 

出力例

 

最初の列が50未満の行を抽出(50以上の行を削除):
 [[4 5 6]]

 

まとめ

 

NumPy配列から条件に基づいて要素、行、列を抽出・削除する能力は、データ分析において非常に重要です。

  • ブールインデックス参照: 最も強力で柔軟な方法で、条件を満たす要素や行・列を効率的に抽出できます。結果は常に新しい配列として返されます。

  • np.delete: 特定のインデックスを指定して要素、行、列を削除したい場合に便利です。

これらのテクニックをマスターすることで、NumPyでのデータ操作がよりスムーズかつ直感的になります。ぜひ、これらの方法をあなたのデータ処理ワークフローに取り入れてみてください!🚀