NumPyのminimum()は、引数に渡した2つの配列の各要素のうち、値が小さい方を取得する関数です。これと同じ関数にfmin()もあります。
minimum()とfmin()の違いは欠損値nanの扱いにあります。minimum()はnanを優先して取得します。fmin()はnanを無視します。したがって、これらは目的に応じて使い分ける必要があります。このページでは、minimum()をメインに解説し、fmin()にも触れることにします。
それでは始めましょう。
NumPy配列の最小値の操作まとめ
NumPy配列の最小値を操作する全方法については、『NumPy配列の最小値やそのインデックスを取得する関数・メソッドまとめ』ですべてまとめています。ぜひ一度ご確認ください。
1. 書式
まずは、np.minimum()の書き方を確認しましょう。いくつかのオプション引数とキーワード引数がありますが、それらはあまり使うことはありません。「そういうのがあるのだな」程度に理解しておけば十分です。
なお minimum()とfmin()の書式は全く同じなため、ここではminimum()のみを掲載します。
書き方:
np.minimum(x1, x2, out=None, where=True, **kwargs)
パラメーター:
引数 | 型 | 解説 |
---|---|---|
x1, x2 | array_like | 比較したい2つの配列を渡します。配列のshapeは一致しているか、ブロードキャスト可能である必要があります。 |
out* | ndarray, None, or tuple of ndarray | 出力結果で上書きする配列を指定します。指定する場合は、出力結果と出力先の配列のshapeが一致している必要があります。 |
where* | array_like | 要素がブール値の配列を渡すと、Trueに該当する箇所は最小値で置き換え、Falseに該当する要素は空の値(未初期化値)になります。 |
**kwargs* | ユニバーサルファンクションのキーワード引数のうち、casting, order, dtype, subokを指定することができます。これらについてはufuncをご参照ください。 | |
* はオプション引数であることを示します。 |
戻り値:
x1とx2のうち要素ごとに値が小さい方を組み合わせた配列: 関数に渡した配列x1とx2のうち最小値の要素を組み合わせた配列を生成します。x1とx2がどちらもスカラーなら戻り値もスカラーになります。 |
一緒に確認したい関数:
2. サンプルコード
それでは実際のコードを見ながら使い方を確認していきましょう。
なお、np.minimum()は、実は、np.where(x1<=x2, x1, x2)と書くのと同じです(x1もx2も欠損値NaNを含んでいないことが前提)。ただし、np.minimum()の方が早いですし、後述するブロードキャストも適切に行ってくれます。
それでは見ていきましょう。
1次元配列同士の場合
np.minimum()は、2つの配列の各要素のうち値が小さい方を取得します。
早速、以下の一連のコードをご覧ください。
まずは配列a を作成します。
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (5, ))
a
次に配列b を作成します。
b = rng.integers(0, 10, (5, ))
b
この配列a とb を、np.minimum()に渡すと、対応する各要素のうち値が大きい方を取得します。
# 配列a とb の要素のうち小さいを取得
np.minimum(a, b)
重要なポイントとして、np.minimum()は、欠損値nanとの比較ではnanを優先して取得します。
# 欠損値nanがある場合はnanを取得
c = np.array([1, 2, 3, 4, np.nan])
np.minimum(a, c)
欠損値nanを優先したくない場合は、fmax()を使います。
# 欠損値nanを無視したい場合はfminを使う
np.fmin(a, c)
2次元配列同士の場合
多次元配列に対しても同様に機能します。例として2次元配列同士の場合を見てみましょう。
まず、以下の一連のコードで、同じshapeの2次元配列a とb を作成しています。
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 30, (2, 5))
a
b = rng.integers(0, 30, (2, 5))
b
これを、np.minimum()に渡すと、各行各列の要素のうち値が小さい方を取得します。
# 基本的には同じshapeの配列同士を渡す
np.minimum(a, b)
基本的には、np.minimum()に渡す2つの配列のshapeが一致している必要がありますが、以下のように一方がブロードキャスト可能なshapeである場合も可能です。
# 2つの配列はブロードキャスト可能な形状になっていれば良い
np.minimum(a, np.array([[15],[15]]))
ブロードキャストについては『覚えておくべきNumPy配列のブロードキャストのルール』で詳しく解説していますので、是非ご確認ください。
行や列を指定して比較
オプション引数whereを使うと、最小値を求める行や列などを指定することができます。
早速、以下の一連のコードをご覧ください。
まず配列a を作成します。
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (3, 3))
a
次に配列b を作成します。
b = rng.integers(0, 10, (3, ))
b
以下のコードでは、これらの配列a とb をnp.minimum()に渡していますが、オプション引数whereで1行目と3行目のみa とb の比較するように指示しています。
# Trueの列のみ大きい方の値を取得、Falseの列は未初期化値になる
np.minimum(a, b, where=[True, False, True])
ご覧のように、Trueの行は値が小さい方を取得していますが、Falseの行はランダムな未初期化値を取得しています。未初期化値については、『NumPyのempty関数で空の配列(未初期化配列)を生成する方法』をご覧頂くと理解できると思います。
オプション引数 out と併用した場合、Falseの要素の値は、出力先の配列のままになります。
# outと同時に使うと便利
o = np.zeros((3, 3))
np.minimum(a, b, where=[True, False, True], out=o)
3. まとめ
以上のように、np.minimum()は、関数に渡した2つの配列の要素のうち、値が大きい方を取得する関数です。
注意点として、np.minimum()は、実数と欠損値nanとの比較ではnanを取得します。nanを無視したい場合は np.fmin()を使います。なお、numpy.fmin()は、実数とNaNの比較では実数を取得する点以外は、引数の書き方も使い方も、numpy.minimum()と全く同じです。
コメント