Pythonで最大値・最小値を取得する方法まとめ(max, min)

Pythonでリストなどのイテラブルの要素から最大値を取得する方法をまとめます。

Pythonで最大値・最小値を取得する方法まとめ(max, min)

Pythonでは、複数の値やリストの要素から、最大値・最小値を取得する方法がいくつか用意されています。

標準の組み込み関数やnumpyなどのライブラリを使った方法をまとめます。

組み込み関数maxで最大値を取得する

Pythonの組み込み関数max()では、引数にリストなどのイテラブルオブジェクトを取り、その要素の中で最大の値を返します。比較する要素は数字だけではなく、文字列でも利用することができます。

# 組み込み関数maxで要素の最大値を取得

l = [1, 2, 3, 4, 5]
print(max(l))
# 5

# タプルでも利用できる
t = (1, 2, 3, 4, 5)
print(max(t))
# 5

# 文字列でも最大値(順序が後のもの)を取得できる
s = ["あ", "い", "う", "え", "お"]
print(max(s))
# お

組み込み関数minで最小値を取得する

max()関数と同様に、Pythonの組み込み関数min()では、引数にリストなどのイテラブルオブジェクトを取り、その要素の中で最小の値を返します。比較する要素は数字だけではなく、文字列でも利用することができます。

# 組み込み関数minで要素の最小値を取得

l = [1, 2, 3, 4, 5]
print(min(l))
# 1

# タプルでも利用できる
t = (1, 2, 3, 4, 5)
print(min(t))
# 1

# 文字列でも最小値(順序が先のもの)を取得できる
s = ["あ", "い", "う", "え", "お"]
print(min(s))
# あ

max, min関数のkey引数で、順序を決める方法を指定する

max()関数とmin()関数は共にkey引数を指定することができます。key引数は、最大値と最小値を決める際にどのような比較で順序を決めるのかを指定する関数をとります。

例えば以下の例では、ネストされたリストの要素の最大値を取得する場合に、各要素(リスト)の合計値を基準として順序を決め、最大のものを取得するようにしています。

# key引数で、順序を決める方法を指定する

# 通常の比較
nested_list = [[3, 5], [9, 1], [1, 3], [5, 8]]
print(max(nested_list))
# [9, 1]


# keyを指定した比較
# 各要素の合計値が最大のものを取得
nested_list = [[3, 5], [9, 1], [1, 3], [5, 8]]
print(max(nested_list, key=lambda x: sum(x)))
# [5, 8]

lambda式の使い方については、以下の記事を参考にしてください。

numpyのmax関数で指定の軸ごとに最大値を取得する

NumPyは、Pythonで数値計算を効率よく行うための関数などをまとめた拡張モジュールです。NumPyを使うことで、多次元の配列などの操作をより簡単かつ高速に実行することができるようになります。

NumPyにもmax()関数が定義されており、Python標準のmax()関数とは異なる操作を実行できます。たとえば、二次元以上の配列などで、特定の軸(行や列)ごとに最大値を取得したい場合にはaxis引数を指定します。

なお、NumPyのmax()関数の戻り値の型はnumpy.ndarrayです。

# numpyのmax関数

import numpy as np

# 配列全体の要素の中から最大値を取得
list_2d = [[1, 2, 3], [4, 5, 6]]
max_value = np.max(list_2d)
print(max_value)
# 6

# axis=0(各列)の最大値をそれぞれ取得する
max_value_axis_0 = np.max(list_2d, axis=0)
print(max_value_axis_0)
# [4 5 6]

# axis=1(各行)の最大値をそれぞれ取得する
max_value_axis_1 = np.max(list_2d, axis=1)
print(max_value_axis_1)
# [3 6]

keepdims=Trueを指定すると、元々の配列の次元を保持したまま、指定した最大値を取得します。

# numpyのmax関数でkeepdims=Trueを指定

import numpy as np

# それぞれ、ネストされたリストの次元を保ったまま最大値を取得
list_2d = [[1, 2, 3], [4, 5, 6]]
max_value = np.max(list_2d, keepdims=True)
print(max_value)
# [[6]]

max_value_axis_0 = np.max(list_2d, axis=0, keepdims=True)
print(max_value_axis_0)
# [[4 5 6]]

max_value_axis_1 = np.max(list_2d, axis=1, keepdims=True)
print(max_value_axis_1)
# [[3] [6]]

通常のmax()関数では、numpyのnanは最大値として扱われるため、注意してください。nanを無視して、各要素の中の最大値を取得したい場合にはnumpy.nanmax()を使用します。この場合の戻り値はfloat型になります。

# numpyのnanは最大値として扱われる

import numpy as np

# numpy.max()では、nanは最大値として扱われる
list_2d = [[1, 2, 3], [np.nan, 5, 6]]
max_value = np.max(list_2d)
print(max_value)
# nan


# numpy.nanmax()を使うと、nanは無視される
list_2d = [[1, 2, 3], [np.nan, 5, 6]]
max_value_without_nan = np.nanmax(list_2d)
print(max_value_without_nan)
# 6.0

# 型がfloatになるので注意
print(type(max_value_without_nan))
# <class 'numpy.float64'>

numpyのmin関数で指定の軸ごとに最小値を取得する

max()関数と同様に、NumPyのmin()関数もあります。使い方はmax()関数と同じで、多次元配列向けに軸ごとの最小値の取得などが行えます。axiskeepdims引数も同様に利用することができます。

NumPyのmin()関数の戻り値の型はnumpy.ndarrayです。

# numpyのmin関数

import numpy as np

list_2d = [[1, 2, 3], [4, 5, 6]]

# 配列全体の要素の中から最小値を取得
min_value = np.min(list_2d)
print(min_value)
# 1

# axis=0(各列)の最小値をそれぞれ取得する
min_value_axis_0 = np.min(list_2d, axis=0)
print(min_value_axis_0)
# [1 2 3]

# axis=1(各行)の最小値をそれぞれ取得する
min_value_axis_1 = np.min(list_2d, axis=1)
print(min_value_axis_1)
# [1 4]


# それぞれ、ネストされたリストの次元を保ったまま最小値を取得
min_value = np.min(list_2d, keepdims=True)
print(min_value)
# [[1]]

min_value_axis_0 = np.min(list_2d, axis=0, keepdims=True)
print(min_value_axis_0)
# [[1 2 3]]

min_value_axis_1 = np.min(list_2d, axis=1, keepdims=True)
print(min_value_axis_1)
# [[1] [4]]

min()関数の中でも、nanは常に最小値として扱われます。nanを無視して各要素の中の最小値を取得したい場合には、numpy.nanmin()を使用します。こちらも戻り値はfloat型になります。

# numpyのnanは最小値として扱われる

import numpy as np

# numpy.min()では、nanは最小値として扱われる
list_2d = [[1, 2, 3], [np.nan, 5, 6]]
min_value = np.min(list_2d)
print(min_value)
# nan


# numpy.nanmin()を使うと、nanは無視される
list_2d = [[1, 2, 3], [np.nan, 5, 6]]
min_value_without_nan = np.nanmin(list_2d)
print(min_value_without_nan)
# 1.0

# 型がfloatになるので注意
print(type(min_value_without_nan))
# <class 'numpy.float64'>