2017-02-06 2 views
5

In numpy.argmax Funktion, Krawatte brechen zwischen mehreren Max Elemente ist so, dass das erste Element zurückgegeben wird. Gibt es eine Funktion zum Randomisieren von Tie Breaking, so dass alle maximalen Zahlen die gleiche Chance haben, ausgewählt zu werden?Numpy argmax - zufällige Krawatte brechen

Unten finden Sie ein Beispiel direkt aus der Dokumentation zu 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 

ich nach Möglichkeiten suchen, so dass 1. und 5. Elemente in der Liste mit der gleichen Wahrscheinlichkeit zurückgegeben werden.

Vielen Dank!

Antwort

9

Verwendung np.random.choice -

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

Beginnen wir mit drei max Kandidaten für ein Array überprüfen -

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

Im Falle eines mehrdimensionalen Array wird choice nicht funktionieren.

Eine Alternative ist

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

Wenn aus irgendeinem Grund die Erzeugung von Zufalls Schwimmern ist langsamer als ein anderes Verfahren, können random.random mit diesem anderen Verfahren ersetzt werden.

Verwandte Themen