2013-06-13 5 views
21

Da Numpy's tutorial, l'asse può essere indicizzato con numeri interi, come 0 è per colonna, 1 è per riga, ma non capisco perché sono indicizzati in questo modo? E come faccio a capire l'indice di ciascun asse quando si affronta l'array multidimensionale?come viene indicizzato l'asse nell'array di numpy?

+5

'0' deve fare riferimento alle righe e' 1' deve fare riferimento alle colonne. Sospetto che stiate pensando ad es. '.sum (axis = 0)' che somma * lungo * le righe (producendo i totali delle colonne). – nneonneo

+0

@nneonneo, sì è quello che intendo, quindi come faccio a sapere l'indice di ciascun asse? – Alcott

risposta

48

Per definizione, il numero dell'asse della dimensione è l'indice di quella dimensione all'interno dell'array shape. È anche la posizione utilizzata per accedere a quella dimensione durante l'indicizzazione.

Ad esempio, se un array 2D a ha forma (5,6), è possibile accedere a a[0,0] fino a a[4,5]. L'asse 0 è quindi la prima dimensione (le "righe") e l'asse 1 è la seconda dimensione (le "colonne"). Nelle dimensioni superiori, dove "riga" e "colonna" cessano di avere un senso, prova a pensare agli assi in termini di forme e indici coinvolti.

Se si esegue .sum(axis=n), ad esempio, la dimensione n viene compressa ed eliminata, con tutti i valori nella nuova matrice pari alla somma dei valori compressi corrispondenti. Ad esempio, seha la forma (5,6,7,8) e lo si fa, l'asse 2 (dimensione con dimensione 7) viene compresso e il risultato ha forma (5,6,8). Inoltre, c[x,y,z] equivale alla somma di tutti gli elementi c[x,y,:,z].

+0

Grazie mille. – Alcott

+0

Grazie per questa risposta. Ha chiarito molto le cose per me. –

+1

questo potrebbe aiutare a visualizzare https://youtu.be/gtejJ3RCddE?t=2h38m15s – bicepjai

5

In generale, asse = 0, significa tutte le celle con prima dimensione variano con ciascun valore di 2 ° dimensione e 3a dimensione e così via

Ad esempio, un array a 2 dimensioni ha due assi corrispondenti: la prima esecuzione verticalmente verso il basso attraverso le righe (asse 0), e la seconda corsa orizzontale lungo le colonne (asse 1)

per 3D, diventa complessa, quindi, impiego multiplo in cicli

>>> 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]])) 
2

è possibile afferrare asse in questo modo :

>>> 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) 

Ho creato un array di una forma con valori diversi (4,2,3) in modo da poter distinguere chiaramente la struttura. Asse diverso significa diverso 'strato'.

Cioè, axis = 0 indice la prima dimensione della forma (4,2,3). Si riferisce agli array nel primo []. Ci sono 4 elementi in esso, e la sua forma è 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 = 1 indice la seconda dimensione in forma (4,3,2). Ci sono 2 elementi in ogni matrice del livello: axis = 0, e.c. Nell'array di

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

. I due elementi sono:

array[1, 2, 3] 

array[2, 2, 3] 

Il terzo valore forma significa che ci sono 3 elementi in ogni elemento dell'array di strato: axis = 2. E.C. Ci sono 3 elementi in array[1, 2, 3]. Questo è esplicito.

E inoltre, è possibile indicare l'asse/le dimensioni dal numero di [] all'inizio o alla fine.In questo caso, il numero è 3 ([[[), quindi è possibile scegliere axis da axis = 0, axis = 1 e axis = 2.

Problemi correlati