numpyで学習結果の多数決
numpy
Lastmod: 2021-07-17

複数の学習結果を多数決したい時、以下のような操作が必要になります。

image

これを実現するには転置してmapで各行に対して最頻値を求めればOKです。

results = np.array([result_1, result_2, result_3])
[*map(lambda x: np.argmax(np.bincount(x)), result.T)]
>>> [0, 2, 2, 1]

解説

まず、例として以下のような配列を準備します。

>>> import numpy as np
>>> a = np.array([0,1,2,3])
>>> b = np.array([0,2,2,1])
>>> c = np.array([1,2,2,1])
>>> np.array([a,b,c])
array([[0, 1, 2, 3],
       [0, 2, 2, 1],
       [1, 2, 2, 1]])

転置すると行と列が入れ替わり多数決を取れる形になります。

>>> np.array([a,b,c]).T
array([[0, 0, 1],
       [1, 2, 2],
       [2, 2, 2],
       [3, 1, 1]])

mapでそれぞれの配列に対して最頻値を求めます。

>>> [*map(lambda x:np.argmax(np.bincount(x)), np.array([a,b,c]).T)]
[0, 2, 2, 1]

おまけ Python2向け

Python2だと以下のように書けば動いてくれます。

list(map(lambda x: np.argmax(np.bincount(x)), result.T))