2009-05-24 39 views

risposta

112

Potrebbe essere che stai usando un NumPy array? Python ha il modulo array, ma questo non supporta gli array multidimensionali. Anche le liste di Python normali sono monodimensionali.

Tuttavia, se si dispone di un semplice elenco bidimensionale come questo:

A = [[1,2,3,4], 
    [5,6,7,8]] 

allora si può estrarre una colonna come questo:

def column(matrix, i): 
    return [row[i] for row in matrix] 

Estrazione seconda colonna (indice 1):

>>> column(A, 1) 
[2, 6] 

Oppure, in alternativa, semplicemente:

>>> [row[1] for row in A] 
[2, 6] 
8

Anche l'operatore itemgetter può essere d'aiuto, se ti piace il python in stile map-reduce, piuttosto che le list comprehensions, per una piccola varietà!

# tested in 2.4 
from operator import itemgetter 
def column(matrix,i): 
    f = itemgetter(i) 
    return map(f,matrix) 

M = [range(x,x+5) for x in range(10)] 
assert column(M,1) == range(1,11) 
+1

uso itertools.imap per grandi quantità di dati –

+0

L'approccio itemgetter correvano 50x più veloce rispetto alla lista approccio di comprensione per il mio caso d'uso. Python 2.7.2, caso d'uso era un sacco di iterazioni su una matrice con poche centinaia di righe e colonne. – joelpt

130
>>> import numpy as np 
>>> A = np.array([[1,2,3,4],[5,6,7,8]]) 

>>> A 
array([[1, 2, 3, 4], 
    [5, 6, 7, 8]]) 

>>> A[:,2] # returns the third columm 
array([3, 7]) 

Vedere anche: "numpy.arange" e "rimodellare" allocare memoria

Esempio: (Assegnazione un array con sagomatura della matrice (3x4))

nrows = 3 
ncols = 4 
my_array = numpy.arange(nrows*ncols, dtype='double') 
my_array = my_array.reshape(nrows, ncols) 
+1

Mi ci sono volute 2 ore per scoprire [:, 2] indovinate questa funzione non nella letteratura ufficiale sull'affettatura? – sloven

+0

Cosa significa la virgola? – Phil

+0

@Phil '[row, col]'. la virgola si separa. – AsheKetchum

49

Se si dispone di un array come

a = [[1, 2], [2, 3], [3, 4]] 

Th it si estrae la prima colonna del genere:

[row[0] for row in a] 

Così il risultato è simile al seguente:

[1, 2, 3] 
23

check it out!

a = [[1, 2], [2, 3], [3, 4]] 
a2 = zip(*a) 
a2[0] 

è la stessa cosa come sopra, tranne qualche modo è più ordinato la zip non funziona ma richiede array singoli come argomenti, il * una sintassi scompatta l'array multidimensionale in argomenti di matrice singoli

+5

Cosa c'è sopra? Ricorda che le risposte non sono sempre ordinate allo stesso modo. – Muhd

+2

Questo è pulito, ma potrebbe non essere il più efficiente se le prestazioni sono un problema, poiché traspone l'intera matrice. – IceArdor

+2

FYI, questo funziona in python 2, ma in python 3 si otterrà l'oggetto generatore, che naturalmente non è pedice. –

1

Nonostante usando zip(*iterable) trasposizione di una lista annidata, è anche possibile utilizzare il seguente se le liste nidificate variano in lunghezza:

map(None, *[(1,2,3,), (4,5,), (6,)]) 

risultati in:

01.235.
[(1, 4, 6), (2, 5, None), (3, None, None)] 

La prima colonna è quindi:

map(None, *[(1,2,3,), (4,5,), (6,)])[0] 
#>(1, 4, 6) 
2

Beh un 'po' in ritardo ...

Nel caso in cui le prestazioni contino e i dati siano a forma rettangolare, è possibile anche memorizzarli in una dimensione e accedere alle colonne mediante taglio regolare ad es. ...

A = [[1,2,3,4],[5,6,7,8]]  #< assume this 4x2-matrix 
B = reduce(operator.add, A) #< get it one-dimensional 

def column1d(matrix, dimX, colIdx): 
    return matrix[colIdx::dimX] 

def row1d(matrix, dimX, rowIdx): 
    return matrix[rowIdx:rowIdx+dimX] 

>>> column1d(B, 4, 1) 
[2, 6] 
>>> row1d(B, 4, 1) 
[2, 3, 4, 5] 

La cosa bella è che questo è veramente veloce. Tuttavia, gli indici negativi non funzionano qui! Quindi non è possibile accedere all'ultima colonna o riga per indice -1.

Se è necessaria l'indicizzazione negativa, è possibile regolare un po 'le funzioni di accesso, ad es.

def column1d(matrix, dimX, colIdx): 
    return matrix[colIdx % dimX::dimX] 

def row1d(matrix, dimX, dimY, rowIdx): 
    rowIdx = (rowIdx % dimY) * dimX 
    return matrix[rowIdx:rowIdx+dimX] 
+0

Ho controllato questo metodo e il costo del recupero della colonna è molto più economico di quelli annidati per cicli. Tuttavia, la riduzione di una matrice 2d in 1d è costosa se la matrice è grande, ad esempio 1000 * 1000. –

3

un altro modo utilizzando matrici

>>> from numpy import matrix 
>>> a = [ [1,2,3],[4,5,6],[7,8,9] ] 
>>> matrix(a).transpose()[1].getA()[0] 
array([2, 5, 8]) 
>>> matrix(a).transpose()[0].getA()[0] 
array([1, 4, 7]) 
6
[matrix[i][column] for i in range(len(matrix))] 
0

Tutte le colonne di una matrice in un nuovo elenco:

N = len(matrix) 
column_list = [ [matrix[row][column] for row in range(N)] for column in range(N) ] 
5

È possibile utilizzare anche questo:

values = np.array([[1,2,3],[4,5,6]]) 
values[...,0] # first column 
#[1,4] 

Nota: questo non funziona per la matrice incorporata e non è allineato (ad es. np.array ([[1,2,3], [4,5,6,7]]))

6

Penso che si desidera estrarre una colonna da un array come una matrice di seguito

import numpy as np 
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 

ora, se si vuole ottenere la terza colonna nel formato

D=array[[3], 
[7], 
[11]] 

Allora avete bisogno di fare prima la matrice di una matrice

B=np.asmatrix(A) 
C=B[:,2] 
D=asarray(C) 

E ora si può fare elemento saggio calcoli come faresti in Excel.

+1

Mentre questo mi ha aiutato molto, penso che la risposta possa essere molto più breve: 1. A = np.array ([[1,2,3,4], [5,6,7,8], [9, 10,11,12]]) 2. A [:, 1] >> array ([2, 6, 10]) – Ufos

3

diciamo che abbiamo n X m matrice (n righe e m colonne) dicono 5 righe e 4 colonne

matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]] 

Per estrarre le colonne in pitone, possiamo usare di lista come questo

[ [row[i] for row in matrix] for in range(4) ] 

Puoi sostituire 4 con qualsiasi numero di colonne della tua matrice. Il risultato è

[ [1,5,9,13,17],[2,10,14,18],[3,7,11,15,19],[4,8,12,16,20] ]

3
def get_col(arr, col): 
    return map(lambda x : x[col], arr) 

a = [[1,2,3,4], [5,6,7,8], [9,10,11,12],[13,14,15,16]] 

print get_col(a, 3) 

funzione mappa in Python è un altro modo per andare.

0

Se si vuole prendere più di una colonna basta usare fetta:

a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) 
    print(a[:, [1, 2]]) 
[[2 3] 
[5 6] 
[8 9]] 
Problemi correlati