NumPy配列の最小値やそのインデックスを取得する関数・メソッドまとめ

NumPyでは、配列の最小値やそのインデックスを取得する方法として以下の7つの関数・メソッドが備えられています。

  • np.amin: 配列の最小値を取得(NaN優先)
  • ndarray.min: 同上のメソッド版(NaN優先)
  • np.nanmin: 配列の最小値を取得(NaN無視)
  • np.argmin: 最小値のインダイスを取得(NaN優先)
  • ndarray.argmin: 同上のメソッド版(NaN優先)
  • np.minimum: 2つの配列のうち最小値を取得(NaN優先)
  • np.fmin: 同上(Nan無視)

それぞれ、最小値そのものを取得したり、最小値のインダイスを取得したり、2つの配列の各要素を比較して値が小さな方を取得したりという違いがあります。

基本的には、最小値そのものを取得する場合が多いと思いますが、最小値のインダイスと様々なスライスのテクニックを組み合わせると更に自由度の高い操作が可能になります。

ここでは、NumPy配列の最小値に関する操作スキルを高めるために、これら全てについてサンプルコードを見ながら、簡潔に解説していきます。

ぜひ参考にして頂ければと思います。

目次

1. 配列の最小値を取得

配列の中の最小値を取得する方法としては、NumPyには以下の3つの関数・メソッドが用意されています。

  • np.amin: 最小値を取得する関数。欠損値NaN優先。
  • ndarray.min: 最小値を取得するメソッド。欠損値NaN優先。
  • np.nanmin: 最小値を取得する関数。欠損値NaN無視。

以下の配列を例にして見ていきましょう。

なお、これらは『NumPyで最小値を取得するamin(), nanmin()関数とmin()メソッドの使い方』で、オプション引数や注意点を含めて、さらに詳しく解説しています。あわせてご確認ください。

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

1.1. np.amin: 配列の最小値を取得(欠損値nan優先)

上の配列を、np.amin関数に渡すと最小値を返してくれます。

In [2]:
np.amin(a)
Out[2]:
0

指定の軸方向での最小値を取得したい場合は、オプション引数axisを指定します。

In [3]:
# 1次元軸方向の最小値
np.amin(a,  axis=-1)
Out[3]:
array([0, 0])
In [4]:
# 2次元方向の最小値
np.amin(a, axis=0)
Out[4]:
array([0, 2, 0])

1.2. ndarray.min: 配列の最小値を取得(欠損値nan優先)

ndarray.minメソッドは、np.amin関数と使い方も引数も全く同じです。

ただし、ndarray.minはメソッドなので、対象となる配列は第一引数に渡すのではなく前に書きます。

In [5]:
# ndarray.min()メソッドも同じ
a.min()
Out[5]:
0
In [6]:
a.min(axis=-1)
Out[6]:
array([0, 0])
In [7]:
a.min(axis=0)
Out[7]:
array([0, 2, 0])

1.3. np.nanmin: 配列の最小値を取得(欠損値nan無視)

np.aminndarray.minは、配列の要素に欠損値NaNが存在する場合、それと実数の比較では、nanを取得します。

In [8]:
# np.amin()もndarray.min()も欠損値優先
a = np.array([np.nan, 0])
np.amin(a)
Out[8]:
nan
In [9]:
a.min()
Out[9]:
nan

もし、実数とNaNを比較した場合に、実数を最小値として取得したい場合は、np.nanminを使います。

In [10]:
# np.nanmin()は欠損値無視
np.nanmin(a)
Out[10]:
0.0

np.nanminは、NaNの取り扱いが異なるだけで、それ以外は使い方も書き方もnp.aminと全く同じです。

2. 最小値のインデックスを取得

NumPy配列の中の最小値のインデックス(インダイス)を取得する方法としては、以下の関数・メソッドが用意されています。

  • np.argmin: 最小値のインデックスを取得する関数。
  • ndarray.argmin: 最小値のインデックスを取得するメソッド。

これらは、前者は関数のため配列を第一引数に渡し、後者はメソッドのため配列を前に書くという点以外は全く同じです。両方とも欠損値NaNを優先します。

NumPyの配列には、Python標準オブジェクトのリストよりも豊富なスライステクニックがあるため、インダイスの配列を取得することによって様々な操作が可能になります。そうした操作の詳細については、『NumPyの配列のスライスの必須テクニックまとめ』で解説しています。

それでは、以下の配列を例に見ていきましょう。

なお、『NumPyの最小値のインデックスを取得するargmin()の使い方』では、これらについて、オプション引数や注意点を含めて、さらに詳しく解説しています。あわせてご確認ください。

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

2.1. np.argmin: 最小値のインダイスを取得(欠損値nan優先)

上の配列を、np.argmin()に渡すと、渡した配列を1次元化した場合のインデックスを返します。上の配列では、最小値は1なので、そのインデックスは0ですね。

なお、最小値が複数ある場合は、最初のインデックスを返します。

In [2]:
# 最小値のインデックス
np.argmin(a)
Out[2]:
0

オプション引数axisで軸を指定すると、その軸方向の要素のうちの最小値のインダイス(インデックスの複数形)を返します。

In [3]:
# 1次元軸方向の最小値のインダイス
np.argmin(a,  axis=-1)
Out[3]:
array([0, 1])
In [4]:
# 2次元方向の最小値のインダイス
np.argmin(a, axis=0)
Out[4]:
array([0, 1, 0])

2.2. ndarray.argmin: 最小値のインダイスを取得(欠損値nan優先)

ndarray.argminは、メソッドであるため、配列を前に書くという点を除くと、np.argminと全く同じです。

In [5]:
# ndarray.argmin()メソッドも同じ
a.argmin()
Out[5]:
0
In [6]:
a.argmin(axis=-1)
Out[6]:
array([0, 1])
In [7]:
a.argmin(axis=0)
Out[7]:
array([0, 1, 0])

なお、np.argminndarray.argminも、配列内に欠損値NaNがある場合は、それと実数を比較した時、NaNのインデックスを取得します。

In [8]:
# np.argmin()もndarray.argmin()も欠損値優先
a = np.array([np.nan, 0])
np.argmin(a)
Out[8]:
0
In [9]:
a.argmin()
Out[9]:
0

3. 2つの配列のうちの最小値を取得

2つの配列の各要素を比較して、値が小さい方を取得する関数・メソッドとして以下の2つが用意されています。

  • np.minimum: 2つの配列の各要素のうち最小値を取得。欠損値NaN優先。
  • numpy.fmin: 2つの配列の各要素のうち最小値を取得。欠損値NaN無視。

以下の配列を例に見ていきましょう。

なお、『NumPyの2つの配列のうち最小値を取得するminimum()の使い方』では、両方について、オプション引数や注意点など、より詳しく解説していますので、ぜひご覧ください。

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

3.1. np.minimum: 2つの配列のうち最小値を取得(欠損値nan優先)

np.minimumの第一引数と第二引数に配列を2つ渡すと、各要素のうち値が小さい方を取得します。

In [3]:
'''  2つの配列のうち最小値を取得して配列を生成  '''
np.minimum(a, b)
Out[3]:
array([[2, 3, 5],
       [6, 5, 5]])

基本的に、2つの配列はshapeが一致している必要があります。しかし、第二引数に渡す配列が、第一引数に渡す配列と、どちらか一方の軸が揃っていれば、以下のコードのように自動でブロードキャストしてくれます

In [4]:
# ブロードキャスト(列方向)
np.minimum(a, [5, 5, 5])
Out[4]:
array([[2, 3, 5],
       [5, 5, 5]])

行方向にブロードキャストしたい場合は、次のように書きます。

In [5]:
# ブロードキャスト(行方向)
np.minimum(a, [[5], [5]])
Out[5]:
array([[2, 3, 5],
       [5, 5, 5]])

np.minimumは、実数と欠損値nanとの比較ではnanを取得することを覚えておきましょう。

In [6]:
# np.minimumは欠損値nan優先
np.minimum(a, [np.nan, 9, np.nan])
Out[6]:
array([[nan,  3., nan],
       [nan,  8., nan]])

3.2. np.fmin: 2つの配列のうち最小値を取得(欠損値nan無視)

実数と欠損値の比較で、実数を取得したい場合は、np.fminを使います。

np.fminは、実数を優先する点を除いて、使い方もオプション引数の書き方も、np.minimumと全く同じです。

In [7]:
'''  欠損値を無視したい場合はnumpy.fmin()を使う  '''
np.fmin(a, [np.NaN, 0, np.NaN])
Out[7]:
array([[2., 0., 5.],
       [8., 0., 5.]])

4. まとめ

NumPyの最小値を取得する方法は以上です。最後に一覧でまとめておきたいと思います。

関数・メソッド名 解説 NaNの扱い
np.amin 配列の最小値を取得 優先
ndarray.min 配列の最小値を取得 優先
np.nanmin 配列の最小値を取得 無視
np.argmin 最小値のインダイスを取得 優先
ndarray.argmin 最小値のインダイスを取得 優先
np.minimum 2つの配列のうち最小値を取得 優先
np.fmin 2つの配列のうち最小値を取得 無視

それぞれ使いこなせるようになるためにご活用いただければと思います。

また、このページでは最小値の操作について解説しましたが、最大値については『NumPy配列の最大値やそのインデックスを取得する関数とメソッドまとめ』で解説しています。あわせてご確認いただくと効率良く学習を進められると思います。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる