note.nkmk.me

NumPy配列ndarrayの条件を満たす要素数をカウント

Date: 2018-03-08 / Modified: 2019-10-28 / tags: Python, NumPy

NumPy配列ndarrayの条件を満たす要素数をカウントする方法をサンプルコードとともに説明する。

ここでは、以下の内容について説明する。

  • ndarray全体に対して条件を満たす要素数をカウント
  • ndarrayの行・列ごとに条件を満たす要素数をカウント
  • numpy.any()で条件を満たす要素がひとつでもあるか確認(全体、行・列ごと)
  • numpy.all()ですべての要素が条件を満たすか確認(全体、行・列ごと)
  • 複数条件の場合
  • 欠損値NaNや無限大infをカウント

条件を満たす要素・行・列を抽出したり削除したりしたい場合は以下の記事を参照。

条件を満たす要素を置換したい場合は以下の記事を参照。

全要素数や次元数などの取得については以下の記事を参照。

スポンサーリンク

ndarray全体に対して条件を満たす要素数をカウント

ndarrayをスカラー値と比較すると、bool値(True, False)を要素としてもつndarrayが返される。<==, !=などで比較できる。

import numpy as np

a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(a < 4)
# [[ True  True  True  True]
#  [False False False False]
#  [False False False False]]

print(a % 2 == 1)
# [[False  True False  True]
#  [False  True False  True]
#  [False  True False  True]]

np.count_nonzero()を使うとTrueの数、すなわち、条件を満たす要素の個数が得られる。

print(np.count_nonzero(a < 4))
# 4

print(np.count_nonzero(a % 2 == 1))
# 6

True1, False0として扱われるのでnp.sum()を使うことも可能。ただし、np.count_nonzero()のほうが高速。

print(np.sum(a < 4))
# 4

print(np.sum(a % 2 == 1))
# 6

ndarrayの行・列ごとに条件を満たす要素数をカウント

多次元配列に対するnp.count_nonzero()は、引数axisを指定することで各軸(各次元)に対する処理となる。

二次元配列の場合、引数axis=0で列ごと、axis=1で行ごとの処理となる。これを利用すると、行・列ごとに条件を満たす要素数をそれぞれカウントできる。

print(np.count_nonzero(a < 4, axis=0))
# [1 1 1 1]

print(np.count_nonzero(a < 4, axis=1))
# [4 0 0]

print(np.count_nonzero(a % 2 == 1, axis=0))
# [0 3 0 3]

print(np.count_nonzero(a % 2 == 1, axis=1))
# [2 2 2]

np.count_nonzero()で引数axisを指定できるようになったのはバージョン1.12.0からなので注意。np.sum()ではバージョン1.7.0から引数axisが実装されているので、古いバージョンではnp.sum()を使えばよい。

numpy.any()で条件を満たす要素がひとつでもあるか確認(全体、行・列ごと)

np.any()は第一引数に渡したndarrayTrueの要素が一つでもあるときにTrueを返し、そうでないときはFalseを返す関数。

print(np.any(a < 4))
# True

print(np.any(a > 100))
# False

np.any()np.count_nonzero()と同じように、引数axisを指定すると行・列ごとの処理となる。

print(np.any(a < 4, axis=0))
# [ True  True  True  True]

print(np.any(a < 4, axis=1))
# [ True False False]

numpy.all()ですべての要素が条件を満たすか確認(全体、行・列ごと)

np.all()は第一引数に渡したndarrayの要素がすべてTrueのときにTrueを返し、そうでないときはFalseを返す関数。

print(np.all(a < 4))
# False

print(np.all(a < 100))
# True

np.all()np.count_nonzero()と同じように、引数axisを指定すると行・列ごとの処理となる。

print(np.all(a < 4, axis=0))
# [False False False False]

print(np.all(a < 4, axis=1))
# [ True False False]

複数条件の場合

複数の条件を組み合わせたい場合は、それぞれの条件式を()で囲み&|でつなげればOK。

print((a < 4) | (a % 2 == 1))
# [[ True  True  True  True]
#  [False  True False  True]
#  [False  True False  True]]

print(np.count_nonzero((a < 4) | (a % 2 == 1)))
# 8

print(np.count_nonzero((a < 4) | (a % 2 == 1), axis=0))
# [1 3 1 3]

print(np.count_nonzero((a < 4) | (a % 2 == 1), axis=1))
# [4 2 2]

括弧()を省略したり、andorを使うとエラーになるので注意。

欠損値NaNや無限大infをカウント

欠損値NaNや無限大infの要素数をカウントする場合は専用の関数を使う。

欠損値NaNの場合。以下のようにデータが欠落したCSVファイルを例とする。

a_nan = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(a_nan)
# [[11. 12. nan 14.]
#  [21. nan nan 24.]
#  [31. 32. 33. 34.]]

欠損値NaNnp.nanfloat('nan')などで生成できるが、欠損値同士を==で比較してもFalseになってしまうため、欠損値をカウントするにはnp.isnan()を使う必要がある。

print(np.nan == np.nan)
# False

print(a_nan == np.nan)
# [[False False False False]
#  [False False False False]
#  [False False False False]]

print(np.isnan(a_nan))
# [[False False  True False]
#  [False  True  True False]
#  [False False False False]]

あとはこれまでの例と同じ。np.count_nonzero()np.sum()Trueの数をカウントすればよい。

print(np.count_nonzero(np.isnan(a_nan)))
# 3

print(np.count_nonzero(np.isnan(a_nan), axis=0))
# [0 1 2 0]

print(np.count_nonzero(np.isnan(a_nan), axis=1))
# [1 2 0]

欠損値ではない要素をカウントしたい場合は否定~を使う。

print(~np.isnan(a_nan))
# [[ True  True False  True]
#  [ True False False  True]
#  [ True  True  True  True]]

np.isnan()を利用すると欠損値を置換したり削除したりすることもできる。

要素が無限大infnp.infなど)かどうかを判定する関数はnp.isinf()。正負どちらの無限大もTrueとなる。

a_inf = np.array([-np.inf, 0, np.inf])
print(a_inf)
# [-inf   0.  inf]

print(np.isinf(a_inf))
# [ True False  True]

無限大は==で比較可能。正負どちらかのみを判定したい場合は==を使えばよい。

print(a_inf == np.inf)
# [False False  True]

print(a_inf == -np.inf)
# [ True False False]

あとはこれまでの例と同じ。

無限大の演算などについては以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事