2015-01-21 22 views
5

Creazione di un array 2D comePerché non l'ordine indice di matrice 2D Python importa quando utilizzato con i due punti (:)

x = [range(i, i+10) for i in xrange(1,100,10)] 

e indicizzazione utilizzando l'operatore due punti come questo

>>> x[2][:] 
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30] 

opere come previsto. Si restituisce tutti fila 2.

Tuttavia, se voglio recuperare tutti colonna 2, avrei istintivamente fare

>>> x[:][2] 

Ma questo torna anche

[21, 22, 23, 24, 25, 26, 27, 28, 29, 30] 

Qual è il ragionamento che sta dietro Questo? Penserei intuitivamente che questo restituisca la colonna 2 di ogni riga.

(Inoltre, sono consapevole che posso usare NumPy fare x [:, 2] o potrei usare list comprehension per raggiungere questo obiettivo, che non è la mia domanda)

+2

Stampa 'x' e capirai perché. – Maroun

+0

'stampa (zip (* x) [2])' –

risposta

2

La ragione è che [:] significa semplicemente "tutto", e che le due operazioni di indicizzazione di fila sono completamente indipendenti.

y = x[2][:] 

è

tmp = x[2] 
y = tmp[:] # this only makes a copy, does nothing else 

Analogamente,

y = x[:][2] 

è

tmp = x[:] # this only makes a copy, does nothing else 
y = tmp[2] 

in effetti sia semplicemente significa

y = x[2] 

Non c'è indicizzazione 2D in corso in qualsiasi momento, Python non ha indicizzazione 2D (anche se NumPy ha hack che rendono si lavoro come se ci fosse l'indicizzazione 2D attuale in corso).

6

x[2][:] tornerà il 3 ° fila della matrice e quindi restituire tutti gli elementi all'interno di quella riga.

x[:][2] restituirà tutte le righe della matrice e quindi restituirà la terza riga di tutte.

In effetti, sono entrambi la stessa, x[2][:] == x[:][2].

stamparli nella console è ovvio il motivo per cui questo accade:

In [138]: x[2] 
Out[138]: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30] 

In [139]: x[2][:] 
Out[139]: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30] 

In [140]: x[:] 
Out[140]: 
[[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, 27, 28, 29, 30], 
[31, 32, 33, 34, 35, 36, 37, 38, 39, 40], 
[41, 42, 43, 44, 45, 46, 47, 48, 49, 50], 
[51, 52, 53, 54, 55, 56, 57, 58, 59, 60], 
[61, 62, 63, 64, 65, 66, 67, 68, 69, 70], 
[71, 72, 73, 74, 75, 76, 77, 78, 79, 80], 
[81, 82, 83, 84, 85, 86, 87, 88, 89, 90], 
[91, 92, 93, 94, 95, 96, 97, 98, 99, 100]] 

In [141]: x[:][2] 
Out[141]: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30] 

Se si desidera ottenere le colonne allora si può trasporre efficacemente le liste utilizzando list(zip(*x)) (aggiunto il list a Py 3). Si potrebbe poi fare:

In [3]: list(zip(*x))[2] 
Out[3]: (3, 13, 23, 33, 43, 53, 63, 73, 83, 93) 

A parte questo, io suggerisco di usare numpy, invece, per questo tipo di lavoro.

+0

Leggi la fine della mia domanda - "(Inoltre, mi rendo conto che posso usare NumPy fare x [:, 2] o potrei usare list comprehension per raggiungere questo obiettivo non è una mia domanda) " –

+1

@Kyle va bene, ma qualcuno in futuro potrebbe avere lo stesso problema ma * non sapere su numpy * quindi il link è per loro tanto quanto lo è per te :) analogamente ho aggiunto il' elenca gli utenti futuri che potrebbero utilizzare Python 3. – Ffisegydd

Problemi correlati