Python NumPy / ndarray のメソッド #9
株式会社リュディアです。今回も NumPy についてまとめていきます。
前回までの NumPy / ndarray のメソッドについてのまとめへのリンクは以下を参考にしてください。
以下のリンクの内容を元にまとめを作っていきます。
今回から Item selection and manipulation に分類されるメソッドをまとめていきます。今回は partition() です。partition という英語自体は分割するという意味ですね。では以下のコードから見ていきましょう。
import numpy as np
x = np.array([9, 10, 11, 12, 4, 2, 3, 1, 7, 6, 5, 8], np.int32)
print(x)
x.partition(2)
print(x)
#
# [ 9 10 11 12 4 2 3 1 7 6 5 8]
#
# [ 1 2 3 12 4 10 11 9 7 6 5 8]
#
要素数 12 の1次元配列 x に対し partition(2) の処理を行っています。この処理の意味は 0から数えて2、つまり小さい方から3つめまでの数値を左端から並べ、それ以上の数値は右側に再配置する、ただし順序に意味はないということです。実際小さい方から 3つ目までの [ 1 2 3 ] まで並べて、残りの数値は右側にありますが並びは意味がなさそうですね。
次に以下の例を見てください。
import numpy as np
x = np.array([9, 10, 11, 12, 4, 2, 3, 1, 7, 6, 5, 8], np.int32)
print(x)
x.partition(-2)
print(x)
#
# [ 9 10 11 12 4 2 3 1 7 6 5 8]
#
# [ 1 2 5 6 4 7 3 8 9 10 11 12]
#
partition() の引数が -2 と負の数になっています。これは大きい方から3つめまでの数値を右端から並べ、それ以下の数字は左側に再配置する、ただし順序に意味はない、ということです。この例では右端の [10 11 12] が大きい方から3つの数です。その続きの [8 9] も並べられているように見えますが偶然ということですね。
今度は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)
z = y.partition(2, 0)
print(y)
#
# [[ 9 10 11 12]
# [ 4 2 3 1]
# [ 7 6 5 8]]
#
# [[ 4 2 3 1]
# [ 7 6 5 8]
# [ 9 10 11 12]]
#
3行4列の配列に対して partition(2, 0) を行っています。第2引数が 0 なので列単位での処理を指定しています。列単位で小さい方から 3 つめまでの数を並べるという指示になります。3行しかないので各列で3つめまでの数を並べると全部整列されてしまいましたね。
同様に第2引数を 1 にした場合の例も以下につけておきます。行単位で小さい方から 3つめまでの数を並べるという指示になります。こちらも4列しかないので行単位で3つめまで並べると4つめも並んでしまいました。
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)
z = np.partition(y, 2, 1)
print(y)
print(z)
#
# [[ 9 10 11 12]
# [ 4 2 3 1]
# [ 7 6 5 8]]
#
# [[ 9 10 11 12]
# [ 1 2 3 4]
# [ 5 6 7 8]]
#
sort() のときに argsort() があったのと同様、partition() にも argpartition() がありますが、今回は省略させてください。
NumPy / ndarray のメソッドに関するまとめの続きは以下からどうぞ。
では、ごきげんよう。