Python NumPy / ndarray のメソッド #11

株式会社リュディアです。今回も NumPy についてまとめていきます。

前回までの NumPy / ndarray のメソッドについてのまとめへのリンクは以下を参考にしてください。

以下のリンクの内容を元にまとめを作っていきます。

今回から最後の分類 Calculation のメソッドをまとめていきます。今回は max(), min(), mean(), var(), std() です。argmax(), argmin() も一緒にまとめます。またメソッドではありませんが NumPy の関数 np.unravel_index() も一緒にまとめます。

import numpy as np

x = np.array([9, 10, 11, 12, 4, 2, 3, 1, 7, 6, 5, 8], np.int32)

print(x)
print(x.max())
print(x.min())
print(x.mean())
print(x.var())
print(x.std())

print(x.max(), x.argmax())
print(x.min(), x.argmin())

#
# [ 9 10 11 12  4  2  3  1  7  6  5  8]
#
# 12                 <- x.max()
# 1                  <- x.min()
# 6.5                <- x.mean()
# 11.916666666666666 <- x.var()
# 3.452052529534663  <- x.std()
# 12 3               <- x.max() とその値のインデクス x.argmax() 
# 1 7                <- x.min() とその値のインデクス x.argmin()
#

では順に見ていきます。要素数 12 の 1次元配列 x に対する max(), min() は x の要素中の最大値最小値を返します。また mean(), var(), std()平均分散標準偏差を返します。メソッドの名前から推測できると思います。

argmax(), argmin() は max(), min() の要素に対応するインデクスを返します。例えば max() の戻り値は 12 で、1次元配列 x における 12 のインデクスは 0 から数えて 3 なので 3を返します。min() についても同様です。

2次元配列の場合も見てみましょう。

import numpy as np

x = np.array([9, 10, 11, 12, 4, 2, 3, 1, 7, 6, 5, 8], np.int32)
y = x.reshape(3, 4)


print(y)
print(y.max())
print(y.min())
print(y.mean())
print(y.var())
print(y.std())

print(y.max(), y.argmax())
print(y.min(), y.argmin())

#
# [ 9 10 11 12  4  2  3  1  7  6  5  8]
#
# 12                 <- x.max()
# 1                  <- x.min()
# 6.5                <- x.mean()
# 11.916666666666666 <- x.var()
# 3.452052529534663  <- x.std()
# 12 3               <- x.max() とその値のインデクス x.argmax() 
# 1 7                <- x.min() とその値のインデクス x.argmin()
#

何と結果は完全に同じです。argmax(), argmin() は期待してたものとは違いますね。では、以下の例をみてください。列単位、行単位で最大値、最小値を求めています。

import numpy as np

x = np.array([9, 10, 11, 12, 4, 2, 3, 1, 7, 6, 5, 8], np.int32)
y = x.reshape(3, 4)

print(y)

print(y.max(axis=0), y.argmax(axis=0))
print(y.min(axis=0), y.argmin(axis=0))

print(y.max(axis=1), y.argmax(axis=1))
print(y.min(axis=1), y.argmin(axis=1))

#
# [[ 9 10 11 12]
#  [ 4  2  3  1]
#  [ 7  6  5  8]]
#
# [ 9 10 11 12] [0 0 0 0] <- 列ごとの最大値とそのインデクス
#
# [4 2 3 1] [1 1 1 1]     <- 列ごとの最小値とそのインデクス
#
# [12  4  8] [3 0 3]      <- 行ごとの最大値とそのインデクス
#
# [9 1 5] [0 3 2]         <- 行ごとの最小値とそのインデクス
#

かなり絞れてきましたけど、実際に欲しいのは2次元で最大値、最小値の行番号、列番号の組ですよね。NumPy の関数 np.unravel_index () を使えば求まります。以下の例をみてください。

import numpy as np

x = np.array([9, 10, 11, 12, 4, 2, 3, 1, 7, 6, 5, 8], np.int32)
y = x.reshape(3, 4)

print(y)

max_idx_2d = np.unravel_index(np.argmax(y), y.shape)
print(max_idx_2d)

min_idx_2d = np.unravel_index(np.argmin(y), y.shape)
print(min_idx_2d)

#
# [[ 9 10 11 12]
#  [ 4  2  3  1]
#  [ 7  6  5  8]]
#
# (0, 3)
#
# (1, 3)
#

np.unravel_index() を使うことで最大値を2次元でみたときの行番号、列番号の組、最小値を2次元でみたときの行番号、列番号の組を求めることができました。

NumPy / ndarray のメソッドに関するまとめの続きは以下からどうぞ。

では、ごきげんよう。




この記事が気に入ったらサポートをしてみませんか?