この記事では、NumPyの配列から最小値を取り出す関数、np.minについて紹介します。
これと反対に最大値を出す関数であるnp.maxについても、以前侍の記事で紹介しました。
基本的にこれとほぼ同じ使い方でnp.minも使うことができます。
また、この記事ではaxisパラメータを使う方法についても紹介します。
基礎から応用までnp.minの使い方をしっかり覚えちゃいましょう!
np.minの使い方
※この記事のコードは、jupyter notebookやjuputer labを使って書かれています。
コードを試すときは是非これらを使ってみてください。
np.minは最小値を出す関数です。
使い方は基本的にnp.maxと同じなので、np.maxが分かる方には簡単です。
# コード In [1]: import numpy as np
配列の情報を表示する関数を作っておきます。
# コード In [2]: def array_info(x): print("配列のshape", x.shape) print("配列の要素のデータ型", x.dtype) print("配列の中身\n",x)
それではサンプル配列を用意します。
# コード In [3]: a = np.arange(0,10) b = np.arange(-10,10).reshape((4,5)) c = b.reshape((2,2,5))
# コード In [4]: print("配列a\n-----------") array_info(a) print("\n配列b\n-----------") array_info(b) print("\n配列c\n-----------") array_info(c)
# 出力結果 [4]: 配列a ----------- 配列のshape (10,) 配列の要素のデータ型 int64 配列の中身 [0 1 2 3 4 5 6 7 8 9] 配列b ----------- 配列のshape (4, 5) 配列の要素のデータ型 int64 配列の中身 [[-10 -9 -8 -7 -6] [ -5 -4 -3 -2 -1] [ 0 1 2 3 4] [ 5 6 7 8 9]] 配列c ----------- 配列のshape (2, 2, 5) 配列の要素のデータ型 int64 配列の中身 [[[-10 -9 -8 -7 -6] [ -5 -4 -3 -2 -1]] [[ 0 1 2 3 4] [ 5 6 7 8 9]]]
配列全体から最小値を見つける
配列全体から最小値を見つけるのは非常に簡単です。
# コード In [5]: np.min(a)
# 出力結果 Out [5]: 0
# コード In [6]: np.min(b)
# 出力結果 Out [6]: -10
この時、多重配列であっても、その全ての要素から最小の要素を見つけ出します。
axisを指定して配列の一部から最小値を見つける
多重配列の場合、axisを指定することで、縦ベクトルや横ベクトルごとに、最小値を見つけることができます。
# コード In [7]: # axis=0 np.min(b, axis=0)
# 出力結果 Out [7]: array([-10, -9, -8, -7, -6])
# コード In [8]: # axis=1 np.min(b, axis=1)
# 出力結果 Out [8]: array([-10, -5, 0, 5])
axisの意味については、以下の記事の解説が秀逸です。
ぜひ読んでみて下さい。
もちろん、三重以上の配列でも同様です。
# コード In [9]: np.min(c, axis=0)
# 出力結果 Out [9]: array([[-10, -9, -8, -7, -6], [ -5, -4, -3, -2, -1]])
# コード In [10]: np.min(c, axis=1)
# 出力結果 Out [10]: array([[-10, -9, -8, -7, -6], [ 0, 1, 2, 3, 4]])
# コード In [11]: np.min(c, axis=2)
# 出力結果 Out [11]: array([[-10, -5], [ 0, 5]])
NaNが入った配列の最小値を見つける
NaNが入った配列だと、最小値の計算が意図したいものになる場合があります。
# コード In [12]: d = np.array([1,2,3,np.nan])
# コード In [13]: np.min(d)
# 出力結果 [13]: /root/anaconda3/lib/python3.6/site-packages/numpy/core/fromnumeric.py:83: RuntimeWarning: invalid value encountered in reduce return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
このように、NaNが入った配列では、NaNが必ず最小値として取り出されます。
NaN以外の要素の中で最小値を見つけたい場合は、np.nanmin関数を使います。
# コード In [14]: np.nanmin(d)
# 出力結果 Out [14]: 1.0
ただし、nanminは実装速度が遅いことに注意が必要です。
%%timeitというコマンドは、jupyterのセルの実行時間を数えてくれる機能を持ちます。これを使って速度比較をしてみましょう。
# コード In [15]: %%timeit np.min(d)
# 出力結果 [15]: /root/anaconda3/lib/python3.6/site-packages/numpy/core/fromnumeric.py:83: RuntimeWarning: invalid value encountered in reduce return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
# コード In [16]: %%timeit np.nanmin(d)
# 出力結果 [16]: 6.23 µs ± 554 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
このように、普通のnp.minの方がいくらか高速なので、NaNの心配がない場合はnp.nanminではなくnp.minを使ったほうが良いでしょう。
まとめ
この記事では、np.ndarrayから最小値を取り出す関数、np.minについて紹介しました。
最大最小を出すような計算はExcelでも多用する機能ですね。
機械学習やデータ解析をする際にも、データの外観を捉えるのは非常に大切です。
データの特性を確認する機能を持った関数は是非とも覚えて起きたいところ。
是非この記事でnp.minについて理解して、機械学習や科学計算の実装に役立ててください。