2017-02-06 23 views
5

numpy.argmaxの関数では、複数のmax要素の間を結ぶと、最初の要素が返されます。 すべての最大数に等しいチャンスが選択されるように、タイブレークをランダム化する機能はありますか?Numpy argmax - ランダムなタイブレーク

以下は、numpy.argmaxのマニュアルからの直接の例です。

>>> b = np.arange(6) 
>>> b[1] = 5 
>>> b 
array([0, 5, 2, 3, 4, 5]) 
>>> np.argmax(b) # Only the first occurrence is returned. 
1 

リストの1番目と5番目の要素が等しい確率で返されるような方法を探しています。

ありがとうございました!

答えて

9

使用np.random.choice -

np.random.choice(np.flatnonzero(b == b.max())) 

の三人の最大の候補を持つ配列のために確認してみましょう - 多次元配列の場合は

In [298]: b 
Out[298]: array([0, 5, 2, 5, 4, 5]) 

In [299]: c=[np.random.choice(np.flatnonzero(b == b.max())) for i in range(100000)] 

In [300]: np.bincount(c) 
Out[300]: array([ 0, 33180,  0, 33611,  0, 33209]) 
3

choiceは動作しません。何らかの理由でランダムフロートを生成する場合

代替は

def randargmax(b,**kw): 
    """ a random tie-breaking argmax""" 
    return np.argmax(np.random.random(b.shape) * (b==b.max()), **kw) 

あるrandom.randomは、他の方法に置き換えることができ、いくつかの他の方法よりも遅いです。

関連する問題