NumPyには、ndarray要素を使った真偽値判定に便利なnp.all関数とnp.any関数があります。この関数を覚えておくことで、要素に不正な値が混在していたり、期待する結果になっているかをチェックすることが簡単になります。

np.all関数は要素が全てTrueになるならTrueに、any関数はいずれかの要素がTrueであればTrueを返す関数です。要素は0もしくはFalseでない限り他の要素はTrueになります。

np.all関数

まずはall関数からみていきます。APIドキュメントは以下の通りです。

numpy.all(a, axis=None, out=None, keepdims=False)

params:

パラメータ名 概要
a array_like
配列に相当するもの
入力する配列、または配列に変換できるオブジェクトを指定します。
axis None、intまたは
intのタプル
(省略可能)初期値None
どの軸方向に要素をみていくかを指定します。
out ndarray (省略可能)初期値None
結果を格納する配列を指定します。
keepdims bool値 (省略可能)初期値False
結果を出力する際、要素数が1になった次元もそのまま残すかどうかを指定します。Trueにすると元の配列に対してブロードキャストを正しく適用して演算をほどこすことができます。

returns:

bool値を要素にもつ配列が返されます。

同様にndarrayクラスにもallメソッドが実装されていますが使い方は全く同じです。引数についてですが、まず条件となる配列をaで指定し、条件の検索範囲をaxisで指定します。そして結果を格納する先をoutで指定し、出力をaと同じ次元にするかどうかをkeepdimsで指定します。keepdims=Trueにすると元の配列に対してブロードキャストを用いて演算を施すことが可能になります。

実際のコードで使い方をみていきましょう。まずは配列を指定するだけのものから試してみます。

In [1]: import numpy as np

In [3]: a = np.array([
   ...:  [1, 1, 1],
   ...:  [1, 0, 0],
   ...:  [1, 0, 1],
   ...: ])

In [4]: np.all(a) # aの要素が1ならTrue、0ならFalseになる。
Out[4]: False

In [5]: b = np.ones((3,3))

In [6]: np.all(b)
Out[6]: True

In [7]: np.all(a<2) # aの要素が全て2未満ならTrue
Out[7]: True

In [8]: np.all(b%3<2) # 3で割ったあまりが2未満
Out[8]: True

次にaxisを指定していきます。

In [9]: np.all(a, axis=0) # 行方向にみていく
Out[9]: array([ True, False, False], dtype=bool)

In [10]: np.all(a, axis=1) # 列方向にみていく
Out[10]: array([ True, False, False], dtype=bool)

In [11]: a[2,0] = 0

In [12]: a
Out[12]:
array([[1, 1, 1],
       [1, 0, 0],
       [0, 0, 1]])

In [13]: np.all(a, axis=0)
Out[13]: array([False, False, False], dtype=bool)

keepdims=Trueにして次元を残します。

In [14]: np.all(a, axis=0, keepdims=True) # keepdims=Trueにする
Out[14]: array([[False, False, False]], dtype=bool)

もちろん、numpy.ndarray.all()でも同様に扱うことができます。

In [15]: a.all()
Out[15]: False

In [16]: b.all()
Out[16]: True

In [17]: a.all(axis=1) # 列方向
Out[17]: array([ True, False, False], dtype=bool)

In [18]: (a<2).all()
Out[18]: True

In [19]: a.all(keepdims=True)
Out[19]: array([[False]], dtype=bool)

np.any関数

次はany関数です。これの使い方はall関数と全く一緒です。ただ、返ってくる結果が異なります。any関数はその名の通り、対象となる範囲で1つでもTrueがあればTrueを返す関数です。

APIドキュメントを以下に掲載しますが、関数の名前以外はall関数と一緒になります。

こちらも同様の関数としてnumpy.ndarray.any関数が存在します。

numpy.any(a, axis=None, out=None, keepdims=False)

params:

パラメータ名 概要
a array_like
配列に相当するもの
入力する配列、または配列に変換できるオブジェクトを指定します。
axis None、intまたは
intのタプル
(省略可能)初期値None
どの軸方向に要素をみていくかを指定します。
out ndarray (省略可能)初期値None
結果を格納する配列を指定します。
keepdims bool値 (省略可能)初期値False
結果を出力する際、要素数が1になった次元もそのまま残すかどうかを指定します。Trueにすると元の配列に対してブロードキャストを正しく適用して演算をほどこすことができます。

returns:

bool値を要素にもつ配列が返されます。

こちらも実際のコードをみていきましょう。

In [1]: import numpy as np

In [2]: a = np.random.randint(10, size=(2,3))

In [3]: a
Out[3]:
array([[9, 8, 6],
       [4, 6, 4]])

In [4]: np.any(a==9) # aの要素で9となるものが1つでもあるかどうか調べる。
Out[4]: True

In [5]: np.any(a==5) # 5となるものは1つもないのでFlase
Out[5]: False

In [6]: np.any(a%2==0, axis=0) # 行方向にみていく。
Out[6]: array([ True,  True,  True], dtype=bool)

In [7]: np.any(a%2==1, axis=1) # 列方向にみていく。
Out[7]: array([ True, False], dtype=bool)

次にkeepdims=Trueにしてみましょう。

In [13]: np.any(a%2==1, axis=1, keepdims=True) # keepdims=Trueにして次元保存
Out[13]:
array([[ True],
       [False]], dtype=bool)

In [14]: np.any(a>2, keepdims=True)
Out[14]: array([[ True]], dtype=bool)

numpy.ndarray.any()でも同様にできます。

In [15]: (a%5==0).any()
Out[15]: False

In [16]: (a>3).any()
Out[16]: True

In [17]: b = np.random.randint(10, size=(2,3))

In [18]: b
Out[18]:
array([[8, 6, 4],
       [3, 0, 4]])

In [19]: (a==b).any(axis=1)
Out[19]: array([False,  True], dtype=bool)

In [20]: (a==b).any(axis=1, keepdims=True)
Out[20]:
array([[False],
       [ True]], dtype=bool)

参考