it-swarm.com.de

numpy: Wie ist die Logik der argmin () - und argmax () - Funktionen?

Ich kann die Ausgabe von argmax und argmin nicht verstehen, wenn ich sie mit dem Achsenparameter verwende. Zum Beispiel:

>>> a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
>>> a
array([[ 1,  2,  4,  7],
       [ 9, 88,  6, 45],
       [ 9, 76,  3,  4]])
>>> a.shape
(3, 4)
>>> a.size
12
>>> np.argmax(a)
5
>>> np.argmax(a,axis=0)
array([1, 1, 1, 1])
>>> np.argmax(a,axis=1)
array([3, 1, 1])
>>> np.argmin(a)
0
>>> np.argmin(a,axis=0)
array([0, 0, 2, 2])
>>> np.argmin(a,axis=1)
array([0, 2, 2])

Wie Sie sehen können, ist der Maximalwert der Punkt (1,1) und der Minimalwert der Punkt (0,0). Also in meiner Logik, wenn ich renne:

  • np.argmin(a,axis=0) Ich erwartete array([0,0,0,0]) 
  • np.argmin(a,axis=1) Ich erwartete array([0,0,0]) 
  • np.argmax(a,axis=0) Ich erwartete array([1,1,1,1]) 
  • np.argmax(a,axis=1) Ich erwartete array([1,1,1]) 

Was ist falsch an meinem Verständnis der Dinge?

24
user4584333

Indem Sie das Argument axis hinzufügen, betrachtet NumPy die Zeilen und Spalten einzeln. Wenn es nicht angegeben ist, wird das Array a in ein einzelnes 1D-Array abgeflacht.

axis=0 bedeutet, dass die Operation down der Spalten eines 2D-Arrays a ausgeführt wird.

Zum Beispiel gibt np.argmin(a, axis=0) den Index des Mindestwerts in jeder der vier Spalten zurück. Der Mindestwert in jeder Spalte wird in fett unten angezeigt:

>>> a
array([[ 1,  2,  4,  7],  # 0
       [ 9, 88,  6, 45],  # 1
       [ 9, 76,  3,  4]]) # 2

>>> np.argmin(a, axis=0)
array([0, 0, 2, 2])

Andererseits bedeutet axis=1, dass die Operation quer über die Zeilen von a ausgeführt wird. 

Das bedeutet, np.argmin(a, axis=1) gibt [0, 2, 2] zurück, da a drei Zeilen hat. Der Index des Minimalwerts in der ersten Zeile ist 0, der Index des Minimalwerts der zweiten und der dritten Zeile ist 2:

>>> a
#        0   1   2   3
array([[ 1,  2,  4,  7],
       [ 9, 88,  6, 45],
       [ 9, 76,  3,  4]])

>>> np.argmin(a, axis=1)
array([0, 2, 2])
40
Alex Riley

Die np.argmax-Funktion arbeitet standardmäßig entlang des abgeflachten Arrays , sofern Sie keine Achse angeben. Um zu sehen, was passiert, können Sie flatten explizit verwenden:

np.argmax(a)
>>> 5

a.flatten()
>>>> array([ 1,  2,  4,  7,  9, 88,  6, 45,  9, 76,  3,  4])
             0   1   2   3   4   5 

Ich habe die Indizes unter dem Array oben nummeriert, um es klarer zu machen. Beachten Sie, dass Indizes in numpy von Null aus nummeriert sind. 

In den Fällen, in denen Sie die Achse angeben, funktioniert sie auch wie erwartet:

np.argmax(a,axis=0)
>>> array([1, 1, 1, 1])

Dies sagt Ihnen, dass der größte Wert in Zeile 1 (2. Wert) für jede Spalte entlang axis=0 (unten) liegt. Sie können dies klarer sehen, wenn Sie Ihre Daten etwas ändern:

a=np.array([[100,2,4,7],[9,88,6,45],[9,76,3,100]])
a
>>> array([[100,   2,   4,   7],
           [  9,  88,   6,  45],
           [  9,  76,   3, 100]])

np.argmax(a, axis=0)
>>> array([0, 1, 1, 2])

Wie Sie sehen, wird jetzt der Maximalwert in Zeile 0 für Spalte 1, Zeile 1 für Spalte 2 und 3 und Zeile 3 für Spalte 4 angegeben.

In der documentation gibt es eine nützliche Anleitung zur numpy-Indexierung.

5
mfitzp

Als Randbemerkung: Wenn Sie die Koordinaten Ihres Maximalwerts im gesamten Array ermitteln möchten, können Sie verwenden

a=np.array([[1,2,4,7],[9,88,6,45],[9,76,3,4]])
>>> a
[[ 1  2  4  7]
 [ 9 88  6 45]
 [ 9 76  3  4]]

c=(np.argmax(a)/len(a[0]),np.argmax(a)%len(a[0]))
>>> c
(1, 1)
4
""" ....READ THE COMMENTS FOR CLARIFICATION....."""

import numpy as np
a = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])

"""np.argmax(a) will give index of max value in flatted array of given matrix """
>>np.arg(max)
5

"""np.argmax(a,axis=0) will return list of indexes of  max value column-wise"""
>>print(np.argmax(a,axis=0))
[1,1,1,1]

"""np.argmax(a,axis=1) will return list of indexes of  max value row-wise"""
>>print(np.argmax(a,axis=1))
[3,1,1]

"""np.argmin(a) will give index of min value in flatted array of given matrix """
>>np.arg(min)
0

"""np.argmin(a,axis=0) will return list of indexes of  min value column-wise"""
>>print(np.argmin(a,axis=0))
[0,0,2,2]

"""np.argmin(a,axis=0) will return list of indexes of  min value row-wise"""
>>print(np.argmin(a,axis=1))
[0,2,2]
2
Nitin Ashutosh

Die Achse im Argument argmax function bezieht sich auf die Achse, entlang der das Array in Scheiben geschnitten wird. 

In einem anderen Wort ist np.argmin(a,axis=0) tatsächlich das Gleiche wie np.apply_along_axis(np.argmin, 0, a), d. H., Um die minimale Position für diese Schnittvektoren entlang der Achse = 0 herauszufinden.

In Ihrem Beispiel ist np.argmin(a, axis=0)[0, 0, 2, 2], was den Werten von [1, 2, 3, 4] in den jeweiligen Spalten entspricht

0
xingzhi.sg