2017-02-06 8 views
5

numpy.argmax समारोह में, एकाधिक अधिकतम तत्वों के बीच तोड़ने के लिए है कि पहला तत्व वापस आ गया है। क्या टाई ब्रेकिंग को यादृच्छिक करने के लिए कोई कार्यक्षमता है ताकि सभी अधिकतम संख्याओं का चयन करने का बराबर मौका हो?न्यूम्पी 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 कि अन्य विधि के साथ प्रतिस्थापित किया जा सकता है।

संबंधित मुद्दे