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

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

  • np.amax: 配列の最大値を取得(NaN優先)
  • ndarray.max: 同上のメソッド版(NaN優先)
  • np.nanmax: 配列の最大値を取得(NaN無視)
  • np.argmax: 最大値のインダイスを取得(NaN優先)
  • ndarray.argmax: 同上のメソッド版(NaN優先)
  • np.maximum: 2つの配列のうち最大値を取得(NaN優先)
  • np.fmax: 同上(NaN無視)

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

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

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

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

目次

1. 最大値を取得

NumPy配列の中の最大値を知りたい場合のために、以下の3つの関数・メソッドが用意されています。

  • np.amax: 最大値を取得する関数。欠損値NaN優先。
  • ndarray.max: 最大値を取得するメソッド。欠損値NaN優先。
  • np.nanmax: 最大値を取得する関数。欠損値NaN無視。

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

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

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

1.1. np.amax: 配列の最大値を取得(nan優先)

上の配列を、np.amax()に渡すと最大値を返してくれます。

In [2]:
np.amax(a)
Out[2]:
6

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

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

1.2. ndarray.max: 配列の最大値を取得(nan優先)

ndarray.max()は、np.amax()と使い方も引数も全く同じです。

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

In [5]:
# ndarray.max()メソッドもnp.amax()関数と同じ
a.max()
Out[5]:
6
In [6]:
a.max(axis=-1)
Out[6]:
array([6, 5])
In [7]:
a.max(axis=0)
Out[7]:
array([5, 6, 4])

1.3. np.nanmax: 配列の最大値を取得(nan無視)

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

In [1]:
# np.amax()もndarray.max()も欠損値優先
import numpy as np
a = np.array([np.nan, 10])
a
Out[1]:
array([nan, 10.])
In [2]:
np.amax(a)
Out[2]:
nan
In [3]:
a.max()
Out[3]:
nan

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

In [4]:
# np.nanmax()は欠損値無視
np.nanmax(a)
Out[4]:
10.0

np.nanmaxは、NaNの取り扱いが異なるだけで、それ以外はnp.amaxと全く同じです。

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

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

  • np.argmax: 最大値のインデックスを取得する関数。欠損値NaN優先。
  • ndarray.argmax: 最大値のインデックスを取得するメソッド。欠損値NaN優先。

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

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

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

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

2.1. np.argmax: 最大値のインダイスを取得(nan優先)

上の配列を、np.argmax()に渡すと、渡した配列を1次元化した場合のインデックスを返します。上の配列では、最大値は5なので、そのインデックスである3を返しています。

In [2]:
# 最大値のインデックスを取得
np.argmax(a)
Out[2]:
3

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

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

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

2.2. ndarray.argmax: 最大値のインデックスを取得(nan優先)

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

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

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

In [8]:
 # どちらも欠損値nan優先
a = np.array([np.NaN, 100, 10000])
print('a:', a)

argmax = np.argmax(a)
print('argmax:', argmax)
arr: [   nan   100. 10000.]
argmax: 0

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

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

  • np.maximum: 2つの配列の各要素のうち最大値を取得。欠損値NaN優先。
  • np.fmax: 2つの配列の各要素のうち最大値を取得。欠損値NaN無視。

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

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

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

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

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

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

基本的に、2つの配列はshapeが一致している必要があります。しかし、第二引数に渡す配列が、第一引数に渡す配列と、どちらか一方の軸が揃っていれば、以下のコードのように自動でブロードキャストしてくれます。ブロードキャストについては、『覚えておくべきNumPy配列のブロードキャストのルール』で詳しく解説しています。基礎知識の1つなので、しっかりと抑えておきましょう。

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

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

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

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

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

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

In [7]:
# 欠損値を無視したい場合はnp.fmax()を使う
np.fmax(a, [np.NaN, 0, np.NaN])
Out[7]:
array([[0., 4., 6.],
       [6., 2., 4.]])

4. まとめ

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

関数・メソッド名 解説 NaNの扱い
np.amax 配列の最大値を取得 優先
ndarray.max 配列の最大値を取得 優先
np.nanmax 配列の最大値を取得 無視
np.argmax 最大値のインダイスを取得 優先
ndarray.argmax 最大値のインダイスを取得 優先
np.maximum 2つの配列のうち最大値を取得 優先
np.fmax 2つの配列のうち最大値を取得 無視

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる