बहु-आयामी NumPy सरणी में सबसे बड़े मान की स्थिति प्राप्त करें


83

मैं एक बहु-आयामी NumPy सरणी में सबसे बड़े मूल्य की स्थिति (सूचकांक) कैसे प्राप्त कर सकता हूं?


मामले में समान रूप से बड़े मूल्यों के साथ कई पद हैं, क्या आपको उन सभी या केवल पहले (या अंतिम या सिर्फ किसी भी) की आवश्यकता है?
ट्रिलियनियन

जवाबों:


179

argmax()विधि की मदद करनी चाहिए।

अपडेट करें

(टिप्पणी पढ़ने के बाद) मेरा मानना ​​है कि argmax()विधि बहुआयामी सरणियों के लिए भी काम करेगी। जुड़ा हुआ दस्तावेज़ इसका एक उदाहरण देता है:

>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3

अपडेट २

( केनीटीएम की टिप्पणी के लिए धन्यवाद ) आप unravel_index(a.argmax(), a.shape)एक टपल के रूप में सूचकांक प्राप्त करने के लिए उपयोग कर सकते हैं :

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)

1
लेकिन मेरे पास एक बहुआयामी सरणी है।
केम

86
unravel_index(a.argmax(), a.shape)इंडेक्स को टपल के रूप में प्राप्त करने के लिए उपयोग करें ।
kennytm

नंबर 3 का क्या मतलब है? ठीक है मैं देखता हूँ। मैं (1,0) ढूंढ रहा था।
kame

2
वास्तव में ट्यूपल के रूप में मान प्राप्त करने के लिए एक अंतर्निहित कार्य होना चाहिए
सितंबर


6

(संपादित करें) मैं एक पुराने उत्तर की बात कर रहा था जिसे हटा दिया गया था । और स्वीकृत उत्तर मेरे बाद आया। मैं सहमत हूं कि argmaxमेरे उत्तर से बेहतर है।

क्या ऐसा करना अधिक पठनीय / सहज नहीं होगा?

numpy.nonzero(a.max() == a)
(array([1]), array([0]))

या,

numpy.argwhere(a.max() == a)

4
अनावश्यक रूप से धीमा, क्योंकि आप अधिकतम की गणना करते हैं और फिर उसकी तुलना सभी से करते हैं। unravel_index (a.argmax (), a.shape)।
पीटर

मैंने इसके लिए मतदान किया क्योंकि यह a.max () की घटनाओं की संख्या के बारे में कुछ नहीं मानता है। जबकि a.argmax () "पहली" घटना लौटाएगा (जो कि बहु-आयामी सरणी के मामले में अ-परिभाषित है क्योंकि यह ट्रैवर्सल पथ की पसंद पर निर्भर करता है)। docs.scipy.org/doc/numpy/reference/generated/... मैं भी लगता है np.where () एक और अधिक प्राकृतिक / पठनीय बल्कि चुना np.nonzero से है ()।
फ़िज़िक्समाइक

2

आप बस एक फ़ंक्शन लिख सकते हैं (जो केवल 2d में काम करता है):

def argmax_2d(matrix):
    maxN = np.argmax(matrix)
    (xD,yD) = matrix.shape
    if maxN >= xD:
        x = maxN//xD
        y = maxN % xD
    else:
        y = maxN
        x = 0
    return (x,y)

0

एक वैकल्पिक तरीका है numpyसरणी को listउपयोग maxऔर indexविधियों में बदलना :

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.