Wie wird die Achse im Array von numpy indiziert?

78

In Numpys Tutorial kann die Achse mit ganzen Zahlen indiziert werden, wie 0für Spalte, 1für Zeile, aber ich verstehe nicht, warum sie auf diese Weise indiziert werden? Und wie finde ich den Index jeder Achse heraus, wenn ich mit mehrdimensionalen Arrays fertig werde?

Alcott
quelle
15
0sollte sich auf die Zeilen und 1auf die Spalten beziehen. Ich vermute, Sie denken zB darüber nach, .sum(axis=0)welche Summen entlang der Zeilen liegen (was zu Spaltensummen führt).
Nneonneo
@nneonneo, ja, das meine ich. Woher kenne ich den Index jeder Achse?
Alcott

Antworten:

138

Per Definition ist die Achsnummer der Dimension der Index dieser Dimension innerhalb des Arrays shape. Dies ist auch die Position, an der während der Indizierung auf diese Dimension zugegriffen wird.

Wenn ein 2D-Array beispielsweise adie Form (5,6) hat, können Sie auf a[0,0]bis zu zugreifen a[4,5]. Achse 0 ist somit die erste Dimension (die "Zeilen") und Achse 1 ist die zweite Dimension (die "Spalten"). Versuchen Sie in höheren Dimensionen, in denen "Zeile" und "Spalte" keinen Sinn mehr ergeben, die Achsen anhand der beteiligten Formen und Indizes zu betrachten.

Wenn Sie dies .sum(axis=n)beispielsweise tun , wird die Dimension nreduziert und gelöscht, wobei jeder Wert in der neuen Matrix der Summe der entsprechenden reduzierten Werte entspricht. Wenn beispielsweise beine Form vorliegt (5,6,7,8)und Sie dies tun c = b.sum(axis=2), wird die Achse 2 (Bemaßung mit Größe 7) reduziert und das Ergebnis hat eine Form (5,6,8). Weiterhin c[x,y,z]ist gleich der Summe aller Elemente b[x,y,:,z].

nneonneo
quelle
für dieses Array (5,6,8) ist 5 die Anzahl der Zeilen oder 6? wie visualisierst du es Zeilen Spalten Tiefe? oder Tiefenzeilen Spalten?
PirateApp
1
@PirateApp Wie gesagt, es ist etwas schwierig, diese Begriffe auf ein 3D-Array anzuwenden. Die Position eines "Tiefen" -Kanals hängt von der Anwendung und der Konvention ab - manchmal ist es 0, manchmal 2, manchmal macht es keinen Sinn, überhaupt einen "Tiefen" -Kanal zu haben.
Nneonneo
17

Sie können die Achse folgendermaßen erfassen:

>>> a = np.array([[[1,2,3],[2,2,3]],[[2,4,5],[1,3,6]],[[1,2,4],[2,3,4]],[[1,2,4],[1,2,6]]])
array([[[1, 2, 3],
    [2, 2, 3]],

   [[2, 4, 5],
    [1, 3, 6]],

   [[1, 2, 4],
    [2, 3, 4]],

   [[1, 2, 4],
    [1, 2, 6]]])
>>> a.shape
(4,2,3)

Ich habe ein Array einer Form mit unterschiedlichen Werten erstellt, (4,2,3)damit Sie die Struktur klar erkennen können. Unterschiedliche Achsen bedeuten unterschiedliche "Ebenen".

Das heißt, axis = 0indizieren Sie die erste Dimension der Form (4,2,3). Es bezieht sich auf die Arrays im ersten []. Es gibt 4 Elemente, also ist seine Form 4:

  array[[1, 2, 3],
        [2, 2, 3]],

  array[[2, 4, 5],
        [1, 3, 6]],

  array[[1, 2, 4],
        [2, 3, 4]],

  array[[1, 2, 4],
        [1, 2, 6]]

axis = 1Indizieren Sie die zweite Dimension in Form (4,2,3). In jedem Array der Ebene befinden sich 2 Elemente : axis = 0, ec Im Array von

 array[[1, 2, 3],
       [2, 2, 3]]

. Die zwei Elemente sind:

array[1, 2, 3]

array[2, 2, 3]

Und der dritte Formwert bedeutet, dass jedes Array-Element der Ebene 3 Elemente enthält : axis = 2. ec Es gibt 3 Elemente in array[1, 2, 3]. Das ist explizit.

Außerdem können Sie die Achse / Abmessungen anhand der Anzahl []am Anfang oder am Ende erkennen. In diesem Fall ist die Zahl 3 ( [[[), so können Sie wählen axisaus axis = 0, axis = 1und axis = 2.

Lyn
quelle
6

Im Allgemeinen bedeutet Achse = 0, dass alle Zellen mit der ersten Dimension mit jedem Wert der 2. Dimension und 3. Dimension usw. variieren

Beispielsweise hat ein zweidimensionales Array zwei entsprechende Achsen: Die erste verläuft vertikal nach unten über Zeilen (Achse 0) und die zweite horizontal über Spalten (Achse 1).

Für 3D wird es komplex. Verwenden Sie daher mehrere for-Schleifen

>>> x = np.array([[[ 0,  1,  2],
    [ 3,  4,  5],
    [ 6,  7,  8]],
   [[ 9, 10, 11],
    [12, 13, 14],
    [15, 16, 17]],
   [[18, 19, 20],
    [21, 22, 23],
    [24, 25, 26]]])

>>> x.shape #(3, 3, 3)

#axis = 0 
>>> for j in range(0, x.shape[1]):
      for k in range(0, x.shape[2]):
        print( "element = ", (j,k), " ", [ x[i,j,k] for i in range(0, x.shape[0]) ])
...
element =  (0, 0)   [0, 9, 18]             #sum is 27
element =  (0, 1)   [1, 10, 19]            #sum is 30
element =  (0, 2)   [2, 11, 20]
element =  (1, 0)   [3, 12, 21]
element =  (1, 1)   [4, 13, 22]
element =  (1, 2)   [5, 14, 23]
element =  (2, 0)   [6, 15, 24]
element =  (2, 1)   [7, 16, 25]
element =  (2, 2)   [8, 17, 26]

>>> x.sum(axis=0)            
array([[27, 30, 33],
       [36, 39, 42],
       [45, 48, 51]])

#axis = 1    
for i in range(0, x.shape[0]):
    for k in range(0, x.shape[2]):
        print( "element = ", (i,k), " ", [ x[i,j,k] for j in range(0, x.shape[1]) ])

element =  (0, 0)   [0, 3, 6]      #sum is 9 
element =  (0, 1)   [1, 4, 7]
element =  (0, 2)   [2, 5, 8]
element =  (1, 0)   [9, 12, 15]
element =  (1, 1)   [10, 13, 16]
element =  (1, 2)   [11, 14, 17]
element =  (2, 0)   [18, 21, 24]
element =  (2, 1)   [19, 22, 25]
element =  (2, 2)   [20, 23, 26]

# for sum, axis is the first keyword, so we may omit it,

>>> x.sum(0), x.sum(1), x.sum(2)
(array([[27, 30, 33],
        [36, 39, 42],
        [45, 48, 51]]),
 array([[ 9, 12, 15],
        [36, 39, 42],
        [63, 66, 69]]),
 array([[ 3, 12, 21],
        [30, 39, 48],
        [57, 66, 75]]))
ndas
quelle