• Skip to content

HEADBOOST

You are here: Home / Python / NumPy / NumPy配列の最大値を取得する方法まとめ
NumPy配列の最大値を取得する方法まとめ

NumPy配列の最大値を取得する方法まとめ

by moriyama · 5月 27, 2019

Tweet
このエントリーをはてなブックマークに追加
LINEで送る

NumPyでは、配列の最大値を取得する方法として、大きく分けて以下の3つがあります。

  • 配列内の最大値を取得する方法
  • 配列内の最大値のインデックスを取得する方法
  • 2つの配列の各要素のうちの最大値を取得する方法

ここでは、これらについて、サンプルコードを見ながら、簡潔に解説していきます。

目次

  • 1. 最大値を取得
    • 1.1. numpy.amax
    • 1.2. ndarray.max
    • 1.3. numpy.nanmax
  • 2. 最大値のインデックスを取得
    • 2.1. numpy.argmax
    • 2.2. ndarray.argmax
  • 3. 2つの配列のうちの最大値を取得
    • 3.1. numpy.maximum
    • 3.2. numpy.fmax
  • 4. まとめ

1. 最大値を取得

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

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

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

なお、これらは『numpy.amax, ndarray.max – 配列の指定の軸の要素の最大値を取得』で、オプション引数や注意点を含めて、さらに詳しく解説しています。あわせてご確認ください。

In [1]:
import numpy as np
arr = np.random.randint(0, 10, (2, 3))
arr
Out[1]:
array([[3, 9, 4],
       [8, 5, 9]])

1.1. numpy.amax

上の配列を、numpy.amax関数に渡すと最大値を返してくれます。

In [2]:
''' numpy.amax関数で最大値を取得  '''
np.amax(arr)
9

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

In [3]:
'''  任意の軸方向の要素の最大値を取得  '''
amax0 = np.amax(arr, axis=0)
print('行方向の要素の最大値:', amax0)

amax1 = np.amax(arr, axis=1)
print('列方向の要素の最大値:', amax1)
行方向の要素の最大値: [8 9 9]
列方向の要素の最大値: [9 9]

1.2. ndarray.max

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

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

In [4]:
'''  ndarray.maxメソッドで最大値を取得  '''
arr.max()
Out[4]:
9

1.3. numpy.nanmax

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

In [5]:
'''  numpy.amax()は欠損値がある場合はそれを取得する  '''
arr_nan = np.array([np.NaN, 100, 10000])
print('arr:', arr_nan)

amax = np.amax(arr_nan)
print('amax:', amax)
arr: [   nan   100. 10000.]
amax: nan

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

In [6]:
'''  numpy.nanmax()なら欠損値は無視する  '''
np.nanmax(arr_nan)
Out[6]:
10000.0

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

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

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

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

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

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

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

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

2.1. numpy.argmax

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

In [2]:
''' numpy.argmax関数で最大値のインデックスを取得  '''
np.argmax(arr)
Out[2]:
2

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

In [3]:
'''  任意の軸方向の要素の最大値のインダイスを取得  '''
arg0 = np.argmax(arr, axis=0)
print('行方向の要素の最大値のインダイス:', arg0)

arg1 = np.argmax(arr, axis=1)
print('列方向の要素の最大値のインダイス:', arg1)
行方向の要素の最大値のインダイス: [1 0 0]
列方向の要素の最大値のインダイス: [2 0]

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

2.2. ndarray.argmax

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

In [4]:
'''  ndarray.argmaxメソッドで最大値のインデックスを取得  '''
arr.argmax()
Out[4]:
2

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

In [5]:
'''  numpy.argmax()は欠損値がある場合はそのインデックスを取得する  '''
arr_nan = np.array([np.NaN, 100, 10000])
print('arr:', arr_nan)

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

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

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

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

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

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

In [1]:
import numpy as np
arr1 = np.random.randint(0, 10, (2, 3))
print('arr1:\n', arr1)

arr2 = np.random.randint(0, 10, (2, 3))
print('arr2:\n', arr2)
arr1:
 [[6 3 3]
 [0 7 4]]
arr2:
 [[2 7 8]
 [9 3 9]]

3.1. numpy.maximum

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

In [2]:
'''  2つの配列のうち最大値を取得して配列を生成  '''
np.maximum(arr1, arr2)
Out[2]:
array([[6, 7, 8],
       [9, 7, 9]])

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

In [3]:
'''  行方向のブロードキャスト  '''
np.maximum(arr1, [5, 5, 5])
Out[3]:
array([[6, 5, 5],
       [5, 7, 5]])

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

In [4]:
'''  列方向のブロードキャスト  '''
np.maximum(arr1, [[5], [5]])
Out[4]:
array([[6, 5, 5],
       [5, 7, 5]])

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

In [5]:
'''  欠損値NaNがある場合はそちらを取得  '''
np.maximum(arr1, [np.NaN, 9, np.NaN])
Out[5]:
array([[nan,  9., nan],
       [nan,  9., nan]])

3.2. numpy.fmax

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

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

In [6]:
'''  欠損値を無視したい場合はnumpy.fmax()を使う  '''
np.fmax(arr1, [np.NaN, 9, np.NaN])
Out[6]:
array([[6., 9., 3.],
       [0., 9., 4.]])

4. まとめ

まとめると、NumPyで最大値を取得する関数・メソッドは以下の通りです。

最大値を取得

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

これらは『numpy.amax, ndarray.max – 配列の指定の軸の要素の最大値を取得』で詳しく解説しています。

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

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

これらは、『numpy.argmax, ndarray.argmax – 最大値のインデックスを取得』で詳しく解説しています。

2つの配列から最大値を取得

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

これらは、『numpy.maximum – 2つの配列の各要素の最大値を取得』でさらに詳しく解説しています。

最小値の取得

また、NumPyの最小値を取得する方法に関しては、『NumPy配列の最小値を取得する方法まとめ』で簡潔に解説していますので、こちらも併せてご確認ください。

Tweet
このエントリーをはてなブックマークに追加
LINEで送る

Filed Under: NumPy

About moriyama

Reader Interactions

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

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

Copyright © 2019 · No Sidebar Pro on Genesis Framework · WordPress · Log in