NumPyで条件に合う要素数を高速カウント!np.count_nonzeroとブールインデックス活用術
NumPy配列(ndarray)を扱う際、「ある条件を満たす要素がいくつあるか?」を知りたい場面は頻繁に訪れます。例えば、特定の値の出現回数、正の値の数、欠損値の数など、様々なカウントニーズがあります。この記事では、NumPy配列の条件を満たす要素数を効率的にカウントする方法について、np.count_nonzero関数とブールインデックス参照を中心に詳しく解説します。
NumPyにおける条件カウントの基本
NumPyでは、条件式を配列に適用すると、結果として**ブール配列(True/Falseの配列)**が生成されます。このブール配列のTrueの数を数えることが、条件を満たす要素のカウントに直結します。
ブール配列とTrueの特性
NumPyにおいて、Trueは数値の1として、Falseは数値の0として扱われます。この特性を利用することで、Trueの合計数を簡単に求めることができます。
np.count_nonzeroを使った高速カウント
np.count_nonzeroは、配列内のゼロではない要素の数をカウントするための関数です。ブール配列に対して使用すると、True(1として扱われる)の数を効率的に数えられます。
1. 1次元配列での使用
サンプルコード
import numpy as np
arr = np.array([10, -5, 0, 20, -15, 30, 0])
# arr > 0 の条件を満たす要素をカウント
count_positive = np.count_nonzero(arr > 0)
print("0より大きい要素の数:", count_positive)
出力例
0より大きい要素の数: 3
2. 多次元配列での使用
多次元配列でも、条件式を適用した結果のブール配列に対してnp.count_nonzeroを使用するだけです。
サンプルコード
import numpy as np
arr_2d = np.array([[1, -2, 3],
[4, 0, -6],
[-7, 8, 9]])
# arr_2d < 0 の条件を満たす要素をカウント
count_negative = np.count_nonzero(arr_2d < 0)
print("0より小さい要素の数:", count_negative)
出力例
0より小さい要素の数: 3
sum()メソッドを使った柔軟なカウント
NumPy配列のsum()メソッドも、ブール配列と組み合わせることで条件を満たす要素をカウントする強力な手段となります。
1. 基本的なsum()によるカウント
ブール配列のTrueは1、Falseは0と評価されるため、単純にsum()を取るだけでTrueの数を数えられます。
サンプルコード
import numpy as np
arr = np.array([10, -5, 0, 20, -15, 30, 0])
# arr == 0 の条件を満たす要素をカウント
count_zeros = (arr == 0).sum()
print("0である要素の数:", count_zeros)
出力例
0である要素の数: 2
2. 特定の軸に沿ったカウント
sum()メソッドは、axis引数を指定することで、特定の軸に沿って条件を満たす要素数をカウントできます。これにより、「各行に存在する特定の要素の数」や「各列に存在する特定の要素の数」などを簡単に集計できます。
サンプルコード
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 2, 6],
[7, 8, 2]])
# 各行における「2」の出現回数をカウント
count_twos_per_row = (arr_2d == 2).sum(axis=1)
print("各行における2の数:", count_twos_per_row)
# 各列における「2」の出現回数をカウント
count_twos_per_col = (arr_2d == 2).sum(axis=0)
print("各列における2の数:", count_twos_per_col)
出力例
各行における2の数: [1 1 1]
各列における2の数: [0 3 0]
まとめ
NumPy配列の条件を満たす要素をカウントする方法はいくつかありますが、特に以下の2つが効率的でよく使われます。
-
np.count_nonzero(condition): 条件式を適用して得られるブール配列のTrueの数を高速にカウントします。シンプルで直感的なため、特定の条件を満たす要素の総数を求めたい場合に最適です。 -
(condition).sum(axis=...): ブール配列のsum()メソッドを利用する方法です。axis引数を指定することで、行ごとや列ごとなど、特定の軸に沿ったカウントも柔軟に行えます。
これらのテクニックをマスターすることで、データの前処理、探索的データ分析、統計量の計算など、NumPyを用いた様々な場面で効率的な処理が可能になります。ぜひ、あなたのNumPyワークフローに取り入れてみてください!
