2009-05-24 22 views

Respuesta

112

¿Podría ser que esté usando un NumPy array? Python tiene el módulo array, pero eso no admite matrices multidimensionales. Las listas normales de Python también son unidimensionales.

Sin embargo, si tiene una lista simple de dos dimensiones como esto:

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

continuación, se puede extraer de una columna de esta manera:

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

extracción de la segunda columna (índice 1):

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

O, alternativamente, simplemente:

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

¡El operador del selector de elementos también puede ayudar, si le gusta el estilo de mapa y reducción de python, en lugar de listas de comprensión, para obtener un poco de variedad!

# 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 de datos de gran tamaño –

+0

El enfoque itemgetter corrió sobre 50 veces más rápido que el enfoque de lista por comprensión para mi caso de uso. Python 2.7.2, el caso de uso contenía muchas iteraciones en una matriz con cientos de filas y columnas. – 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]) 

Ver también: "numpy.arange" y "remodelar" para asignar memoria

Ejemplo: (Asignación de una matriz con la conformación de la matriz (3x4))

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

Me llevó 2 horas descubrir [:, 2] ¿Adivina esta característica no en la literatura oficial sobre rebanar? – sloven

+0

¿Qué significa la coma? – Phil

+0

@Phil '[row, col]'. la coma se separa. – AsheKetchum

49

Si tiene una matriz como

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

Th en extraer de la primera columna de esa manera:

[row[0] for row in a] 

Así, el resultado se parece a esto:

[1, 2, 3] 
23

comprobar que funciona!

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

es lo mismo que anteriormente, excepto alguna manera es más ordenado la cremallera hace el trabajo pero requiere matrices individuales como argumentos, el * una sintaxis desempaqueta la matriz multidimensional en argumentos de matriz individuales

+5

¿Qué hay arriba? Recuerde que las respuestas no siempre se ordenan de la misma manera. – Muhd

+2

Esto está limpio, pero podría no ser el más eficiente si el rendimiento es una preocupación, ya que está transponiendo toda la matriz. – IceArdor

+2

FYI, esto funciona en python 2, pero en python 3 obtendrá un objeto generador, que por supuesto no es subscripible. –

1

a pesar de usar zip(*iterable) para transponer una lista anidada, también se puede usar la siguiente si las listas anidadas varían en longitud:

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

resultados en:

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

La primera columna es así:

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

bien un 'poco' tarde ...

En caso de que el rendimiento sea importante y sus datos tengan forma rectangular, también puede almacenarlos en una dimensión y acceder a las columnas mediante un corte regular, p. ...

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] 

Lo bueno es que es realmente rápido. Sin embargo,, ¡los índices negativos no funcionan aquí! Entonces no puedes acceder a la última columna o fila por índice -1.

Si necesita indexación negativa, puede ajustar un poco las funciones de acceso, p.

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

He comprobado este método y el costo de recuperación de la columna es mucho más barato que anidado para bucles. Sin embargo, reducir una matriz 2d a 1d es costoso si la matriz es grande, digamos 1000 * 1000. –

3

una forma más usando matrices

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

todas las columnas de una matriz en una nueva lista:

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

Se puede utilizar esta así:

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

Nota: Esto no funciona para la matriz incorporada y no está alineado (p. np.array ([[1,2,3], [4,5,6,7]]))

6

Creo que desea extraer una columna de una matriz tal como una matriz a continuación

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

ahora bien, si usted quiere conseguir la tercera columna en el formato

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

Luego hay que hacer primero la matriz una matriz

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

Y ahora se puede hacer elemento sabia cálculos muy parecidos a los que haría en excel.

+1

Si bien esto me ayudó mucho, creo que la respuesta puede ser mucho más corta: 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

digamos que tenemos n X m matriz (n filas y m columnas) dicen 5 filas y 4 columnas

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

Para extraer las columnas de pitón, podemos utilizar la lista de comprensión como esto

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

Puede reemplazar 4 por el número de columnas que tenga su matriz. El resultado es

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

función de mapa en Python es otra manera de ir.

0

Si quieres tomar más de una columna sólo tiene que utilizar la rebanada:

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