numpy.all()は、渡した配列内の要素のすべてが条件を満たすかどうかを確認するための関数です。具体的には、渡した配列の要素のすべてが True であれば True を返し、False か 0 が1つでも含まれている場合は False を返します。
この関数を使うと、ある配列の中の全ての要素が条件を満たしているかどうかや、不正な要素が入っていないかどうかなどを確認することができます。
このページでは、この関数の使い方を簡潔に解説します。
なお、似た関数にnp.any()があります。こちらについては『NumPy配列の要素が1つでも条件を満たすか確認するany()の使い方』で解説しています。両方を使いこなすようにすると良いでしょう。
NumPy配列の条件を満たす要素の操作まとめ
NumPy配列では、条件を満たす要素の値を取得したり、数をカウントしたり、置換したりなど様々な操作が可能です。こうした操作については、『NumPy配列の条件を満たす要素の確認や置換・カウントの方法まとめ』で全てまとめていますので、ぜひご確認ください。
1. 書式
まずは、基本的な書き方を確認しましょう。
書き方:
np.all(a, axis=None, out=None, keepdims=<no value>)
パラメーター:
a: array_likeオブジェクト(配列やリスト、タプルのこと) NumPy配列や、NumPyの配列に変換可能なオブジェクト(リストやタプルなど)を渡します。 |
axis: 整数(int型)か整数(int型)のタプル(オプション) 論理積の削減を行う軸を指定します。デフォルトのNoneでは配列内の全ての要素を一括で判定します。タプルで渡すことで、複数の軸を同時に指定することも可能です。 |
out: 配列(ndarray), (オプション) 戻り値の配列を代入する配列を指定します。戻り値の配列と代入先の配列のshapeが合致している必要があります。 |
keepdims: ブール値(オプション) Trueにすると、戻り値の配列の次元数が、元々の配列 a の次元数のままで維持されます。削減される軸の要素数は1になります。このオプション引数を使うことで、戻り値の配列を元々の配列aに適切にブロードキャストして適用することが可能になります。 |
戻り値:
要素がブール値の配列: ブール値か、要素がブール値の配列を返します。オプション引数outで出力先を指定している場合、出力先の配列の参照を返します。 |
一緒に確認したい関数:
- ndarray.all – 同じ機能のメソッド
- any – 配列の中に1つでも条件を満たす要素があるかどうかを確認
2. サンプルコード
実際のコードを見て使い方を理解しましょう。重要なのは次の点です。
- np.all()がFalseと判定する要素を正確に理解すること
- 多次元配列を渡した時の軸の指定(オプション引数 axis= の使い方)の方法を理解すること
まずは、以上の2点を理解すれば十分です。それでは見ていきましょう。
np.all関数が False と判定する場合
np.all()は、引数に渡したオブジェクトの中に、ブール値 False が含まれていないかどうかを判定して、その結果を返します。
もし、ブール値 False が1つでも含まれていれば False を返します。
# 渡した配列の中にFalseが含まれていればFalseを返す
import numpy as np
x = np.array([True, False])
np.all(x)
Pythonでは、数値の 0 は ブール値 False と同値です。そのため、渡した配列の中に数値の 0 が 含まれている場合も、False と判定されます。
# Pythonでは 0 == False
x = np.array([0, 1, 2])
np.all(x)
ブール値 False と 0 をどちらも含んでいなければ True を返します。
# すべての要素が True なら True を返す
x = np.array([True, True])
np.all(x)
具体的な使い方
この関数は具体的には、次のように、配列内の全ての要素がある条件を満たしているかどうかを確認するために使います。
# 配列 x を作成
x = np.arange(5, 10)
x
# 配列 x の要素がすべて5以上かを確認する
np.all(x >= 5)
# 配列 x の要素がすべて5以下かを確認する
np.all(x <= 5)
このように、np.all()は、配列がある条件を満たしているかどうか、その中に不正な値が入っていないかどうかなどを判定するために使います。
負の数値や、欠損値NaN、無限値inf は True
なお、np.all()が False と判定するのは、対象のオブジェクトが 0 か False を含んでいる場合のみです。そのため、負の数値や、欠損値NaN、無限値inf はすべて True と判定されます。
# 負の数値や欠損値NaN、無限値infはTrue判定
np.all([-1])
np.all([np.nan])
np.all([np.inf])
多次元配列を渡す場合
np.all()に多次元配列を渡した場合は、配列内のすべての要素を判定します。
# 配列内の全ての要素を判定
x = np.arange(6).reshape(2, 3)
np.all(x <= 4)
判定を行う次元軸を指定したい場合は、オプション引数 axis= を使います。axis=0 だと、列ごとに判定を行います。
# 1次元軸(=各列)の要素を判定
np.all(x <= 4 , axis=0)
axis=1 だと、行ごとに判定を行います。
# 2次元軸(=各行)の要素を判定
np.all(x <= 4, axis=1)
ご覧のように、この場合の戻り値の配列の形状は、元々の配列の指定した軸の要素数と同じ長さの1次元配列になります。
keepdims=True で次元数を維持
ただしオプション引数で keepdims=True とすると、戻り値の配列の次元数を元々の配列のままで維持することができます。この場合、元の配列がshape(m, n)
だとすると、axisを指定しない場合はshape(1, 1)
に、axis=0 の場合はshape(1, n)
に、axis=1 の場合はshape(m, 1)
になります。
# 次元数を維持 shape(1, 1)
np.all(x <= 4, keepdims=True)
# shape(1, n)
np.all(x <= 4, axis=0, keepdims=True)
# shape(m, 1)
np.all(x <= 4, axis=1, keepdims=True)
out= で出力結果を他の配列に代入
オプション引数 out=
で出力結果を、他の配列に代入することができます。この時、出力結果の配列と、代入先の配列のshape
が合致している必要があります。
なお、この場合、データ型は出力先の配列のものに合わされます。代入先の配列のデータ型がfloat型なら、そのままfloat型の配列になります(Python では0 = False であることを思い出しましょう)。
# オプション引数out=で、判定結果を他の配列に代入
# データ型は代入先の配列のまま
a = np.empty((3, ))
np.all(x, axis=0, out=a)
a
代入先の配列のデータ型がint型なら、そのままint型になります。
# データ型は代入先の配列のまま
a = np.array([3, 2, 1])
np.all(x, axis=0, out=a)
a
ndarray.allメソッド
なお、全く同じ機能を持つndarray.all()メソッドもあります。使い方はnp.all()と同じです。
# メソッドとして使用することも可能
x = np.arange(6).reshape(2, 3)
(x>4).all(axis=1)
(x>=0).all(axis=1, keepdims=True)
3. まとめ
以上が、np.all()の使い方です。
まずは、オプション引数 axis= までを指定した基本的な使い方をしっかりと把握するようにしましょう。オプション引数の keepdim= や out= は必要に応じて見返すと良いでしょう。
コメント