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)