NumPyの2つの配列のうち最小値を取得するminimum()の使い方

NumPyのminimum()は、引数に渡した2つの配列の各要素のうち、値が小さい方を取得する関数です。これと同じ関数にfmin()もあります。

minimum()fmin()の違いは欠損値nanの扱いにあります。minimum()はnanを優先して取得します。fmin()はnanを無視します。したがって、これらは目的に応じて使い分ける必要があります。このページでは、minimum()をメインに解説し、fmin()にも触れることにします。

それでは始めましょう。

NumPy配列の最小値の操作まとめ
NumPy配列の最小値を操作する全方法については、『NumPy配列の最小値やそのインデックスを取得する関数・メソッドまとめ』ですべてまとめています。ぜひ一度ご確認ください。

目次

1. 書式

まずは、np.minimum()の書き方を確認しましょう。いくつかのオプション引数とキーワード引数がありますが、それらはあまり使うことはありません。「そういうのがあるのだな」程度に理解しておけば十分です。

なお minimum()fmin()の書式は全く同じなため、ここではminimum()のみを掲載します。

numpy.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がどちらもスカラーなら戻り値もスカラーになります。

一緒に確認したい関数:

  • maximum2つの配列の各要素のうち値が大きい方を取得。欠損値NaN優先。
  • fminminimumと同じだが欠損値NaNは無視。
  • amin配列の要素のうち最小値を取得。欠損値NaN優先。
  • nanmin同上。欠損値NaNは無視。
  • fmax, amax, nanmax: 

2. サンプルコード

それでは実際のコードを見ながら使い方を確認していきましょう。

なお、np.minimum()は、実は、np.where(x1<=x2, x1, x2)と書くのと同じです(x1もx2も欠損値NaNを含んでいないことが前提)。ただし、np.minimum()の方が早いですし、後述するブロードキャストも適切に行ってくれます。

それでは見ていきましょう。

1次元配列同士の場合

np.minimum()は、2つの配列の各要素のうち値が小さい方を取得します。

早速、以下の一連のコードをご覧ください。

まずは配列a を作成します。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (5, ))
a
Out[1]:
array([4, 0, 7, 9, 8])

次に配列b を作成します。

In [2]:
b = rng.integers(0, 10, (5, ))
b
Out[2]:
array([7, 4, 3, 5, 3])

この配列a とb を、np.minimum()に渡すと、対応する各要素のうち値が大きい方を取得します。

In [3]:
# 配列a とb の要素のうち小さいを取得
np.minimum(a, b)
Out[3]:
array([4, 0, 3, 5, 3])

重要なポイントとして、np.minimum()は、欠損値nanとの比較ではnanを優先して取得します。

In [4]:
# 欠損値nanがある場合はnanを取得
c = np.array([1, 2, 3, 4, np.nan])
np.minimum(a, c)
Out[4]:
array([ 1.,  0.,  3.,  4., nan])

欠損値nanを優先したくない場合は、fmax()を使います。

In [5]:
# 欠損値nanを無視したい場合はfminを使う
np.fmin(a, c)
Out[5]:
array([1., 0., 3., 4., 8.])

2次元配列同士の場合

多次元配列に対しても同様に機能します。例として2次元配列同士の場合を見てみましょう。

まず、以下の一連のコードで、同じshapeの2次元配列a とb を作成しています。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 30, (2, 5))
a
Out[1]:
array([[17, 19,  8, 12, 12],
       [ 0, 10,  4,  7, 13]])
In [2]:
b = rng.integers(0, 30, (2, 5))
b
Out[2]:
array([[ 9, 13, 29,  6,  5],
       [23, 24, 27, 17,  3]])

これを、np.minimum()に渡すと、各行各列の要素のうち値が小さい方を取得します。

In [3]:
# 基本的には同じshapeの配列同士を渡す
np.minimum(a, b)
Out[3]:
array([[ 9, 13,  8,  6,  5],
       [ 0, 10,  4,  7,  3]])

基本的には、np.minimum()に渡す2つの配列のshapeが一致している必要がありますが、以下のように一方がブロードキャスト可能なshapeである場合も可能です。

In [4]:
# 2つの配列はブロードキャスト可能な形状になっていれば良い
np.minimum(a, np.array([[15],[15]]))
Out[4]:
array([[15, 15,  8, 12, 12],
       [ 0, 10,  4,  7, 13]])

ブロードキャストについては『覚えておくべきNumPy配列のブロードキャストのルール』で詳しく解説していますので、是非ご確認ください。

行や列を指定して比較

オプション引数whereを使うと、最小値を求める行や列などを指定することができます。

早速、以下の一連のコードをご覧ください。

まず配列a を作成します。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 10, (3, 3))
a
Out[1]:
array([[1, 2, 7],
       [7, 2, 0],
       [1, 1, 8]])

次に配列b を作成します。

In [2]:
b = rng.integers(0, 10, (3, ))
b
Out[2]:
array([9, 8, 1])

以下のコードでは、これらの配列a とb をnp.minimum()に渡していますが、オプション引数whereで1行目と3行目のみa とb の比較するように指示しています。

In [3]:
#  Trueの列のみ大きい方の値を取得、Falseの列は未初期化値になる
np.minimum(a, b, where=[True, False, True])
Out[3]:
array([[                   1, -4611042647052049244,                    1],
       [                   7,  4617283349392834113,                    0],
       [                   1, -4613744806828471528,                    1]])

ご覧のように、Trueの行は値が小さい方を取得していますが、Falseの行はランダムな未初期化値を取得しています。未初期化値については、『NumPyのempty関数で空の配列(未初期化配列)を生成する方法』をご覧頂くと理解できると思います。

オプション引数 out と併用した場合、Falseの要素の値は、出力先の配列のままになります。

In [4]:
#  outと同時に使うと便利
o = np.zeros((3, 3))
np.minimum(a, b, where=[True, False, True], out=o)
Out[4]:
array([[1., 0., 1.],
       [7., 0., 0.],
       [1., 0., 1.]])

3. まとめ

以上のように、np.minimum()は、関数に渡した2つの配列の要素のうち、値が大きい方を取得する関数です。

注意点として、np.minimum()は、実数と欠損値nanとの比較ではnanを取得します。nanを無視したい場合は np.fmin()を使います。なお、numpy.fmin()は、実数とNaNの比較では実数を取得する点以外は、引数の書き方も使い方も、numpy.minimum()と全く同じです。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる