NumPy配列の要素を自在に操る!条件による抽出・削除テクニック
NumPyを扱う上で、特定の条件を満たす要素だけを選び出したり、不要な要素や行・列を削除したりする操作は日常茶飯事です。これらの操作を効率的に行うためのNumPyの強力な機能を知ることで、データハンドリングの幅が格段に広がります。この記事では、NumPy配列(ndarray)から条件を満たす要素、行、列を抽出・削除する方法について、具体的なコード例を交えながら詳しく解説します。
条件による要素の抽出(ブールインデックス参照)
NumPyでは、条件式によって生成された真偽値の配列(ブール配列)を使って、元の配列から条件を満たす要素を直接抽出できます。これを「ブールインデックス参照(Boolean Indexing)」と呼びます。
1. 1次元配列からの抽出
サンプルコード
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次元配列になります。
サンプルコード
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. 条件を満たす行の抽出
特定の条件を満たす行全体を抽出したい場合は、軸を指定してブールインデックス参照を行います。
サンプルコード
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. 条件を満たす列の抽出
列を抽出する場合も、同様に軸を指定します。
サンプルコード
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. 特定の要素の削除(実質的な抽出)
条件を満たさない要素を抽出することで、条件を満たす要素を「削除」した配列を作成できます。
サンプルコード
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は、指定したインデックスの要素、行、または列を削除した新しい配列を返します。
サンプルコード
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]]
ブールインデックス参照を使った行・列の削除(残す要素を選ぶ)
特定の条件を満たす行や列を「削除」したい場合、その条件を満たさない行や列を選択することで実現できます。
サンプルコード
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でのデータ操作がよりスムーズかつ直感的になります。ぜひ、これらの方法をあなたのデータ処理ワークフローに取り入れてみてください!🚀

