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

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

maximum()fmax()の違いは欠損値nanの扱いにあります。maximum()はnanを優先して取得します。fmax()はnanを無視します。したがって、これらは目的に応じて使い分ける必要があります。

このページでは、maximum()をメインに解説し、fmax()にも触れることにします。

それでは始めましょう。

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

目次

1. 書式

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

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

numpy.maximum関数

書き方:

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

一緒に確認したい関数:

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

2. サンプルコード

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

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

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

1次元配列同士の場合

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

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

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

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

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

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

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

In [3]:
# 配列a とb の要素のうち大きい方を取得
np.maximum(a, b)
Out[3]:
array([5, 9, 6, 5, 2])

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

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

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

In [5]:
# 欠損値nanを無視したい場合はfmaxを使う
np.fmax(a, c)
Out[5]:
array([1., 9., 6., 5., 2.])

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([[13, 10, 29, 18, 21],
       [26, 25,  1, 13,  2]])
In [2]:
b = rng.integers(0, 30, (2, 5))
b
Out[2]:
array([[25,  5, 25, 19, 13],
       [18,  2, 23, 22,  7]])

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

In [3]:
# 基本的には同じshapeの配列同士を渡す
np.maximum(a, b)
Out[3]:
array([[25, 10, 29, 19, 21],
       [26, 25, 23, 22,  7]])

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

In [4]:
# 2つの配列はブロードキャスト可能な形状になっていれば良い
np.maximum(a, np.array([[10],[10]]))
Out[4]:
array([[13, 10, 29, 18, 21],
       [26, 25, 10, 13, 10]])

ブロードキャストについては『覚えておくべき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([[5, 7, 8],
       [2, 3, 7],
       [7, 1, 5]])

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

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

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

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

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

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

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

3. まとめ

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

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる