¿Cómo se extrae una columna de una matriz multidimensional?

Respuestas:

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

Vea también: "numpy.arange" y "rehape" para asignar memoria

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

nrows = 3
ncols = 4
my_array = numpy.arange(nrows*ncols, dtype='double')
my_array = my_array.reshape(nrows, ncols)
Andre Luiz
fuente
8
Me tomó 2 horas descubrir [:, 2] ¿adivina esta característica que no está en la literatura oficial sobre corte?
niken
¿Qué significa la coma?
Phil
3
@Phil [row, col]. La coma se separa.
AsheKetchum
11
¿Cómo puede esta respuesta tener tantos votos positivos? OP nunca dijo que era una matriz
numpy
3
para extraer 2 columnas: A [:, [1,3]] por ejemplo extraer segunda y cuarta columna
sadalsuud
177

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

Sin embargo, si tiene una lista bidimensional simple como esta:

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

entonces puedes extraer una columna como esta:

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

Extrayendo la segunda columna (índice 1):

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

O alternativamente, simplemente:

>>> [row[1] for row in A]
[2, 6]
Martin Geisler
fuente
80

Si tienes una matriz como

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

Luego extrae la primera columna así:

[row[0] for row in a]

Entonces el resultado se ve así:

[1, 2, 3]
Andrei Arsenin
fuente
38

¡Echale un vistazo!

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

es lo mismo que antes, excepto que de alguna manera es más ordenado, el zip hace el trabajo pero requiere matrices individuales como argumentos, la sintaxis * a desempaqueta la matriz multidimensional en argumentos de matriz única

Mac D
fuente
77
¿Qué hay arriba? Recuerde que las respuestas no siempre se ordenan de la misma manera.
Muhd
2
Esto es 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
66
Para su información, esto funciona en Python 2, pero en Python 3 obtendrá un objeto generador, que por supuesto no es subscriptable.
Rishabh Agrahari
@RishabhAgrahari ¿De todos modos hacer esto zip en Py3?
CtrlAltF2
2
@WarpDriveEnterprises sí, tendrás que convertir el objeto generador a la lista y luego realizar la suscripción. ejemplo:a2 = zip(*a); a2 = list(a2); a2[0]
Rishabh Agrahari
14
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)

La función de mapa en Python es otra forma de hacerlo.

Peter Paul
fuente
11
>>> x = arange(20).reshape(4,5)
>>> x array([[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]])

si quieres la segunda columna puedes usar

>>> x[:, 1]
array([ 1,  6, 11, 16])
simomod
fuente
1
Esto está usando numpy?
Foreever
1
No puedo encontrar ninguna documentación arange()en Python3 fuera de numpy. ¿Nadie?
Kevin W Matthews
10
[matrix[i][column] for i in range(len(matrix))]
renatov
fuente
9

¡El operador itemgetter también puede ayudar, si le gusta el estilo de reducción de mapas python, en lugar de las comprensiones de listas, para una pequeña 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)
Gregg Lind
fuente
1
use itertools.imap para datos grandes
Paweł Polewicz
El enfoque itemgetter corrió aproximadamente 50 veces más rápido que el enfoque de comprensión de la lista para mi caso de uso. Python 2.7.2, el caso de uso fue muchas iteraciones en una matriz con unos cientos de filas y columnas.
Joelpt
7

También puedes usar esto:

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

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

Sergey
fuente
6

Creo que desea extraer una columna de una matriz, 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 si quieres obtener la tercera columna en el formato

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

Luego, primero debe hacer que la matriz sea una matriz

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

Y ahora puede hacer cálculos sabios de elementos como lo haría en Excel.

danielinthelionsden
fuente
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
6

digamos que tenemos n X mmatriz ( nfilas y mcolumnas) digamos 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 en Python, podemos usar la comprensión de listas como esta

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

Serge_k
fuente
¿Esto crea una lista completamente nueva?
Kevin W Matthews
5
array = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]

col1 = [val[1] for val in array]
col2 = [val[2] for val in array]
col3 = [val[3] for val in array]
col4 = [val[4] for val in array]
print(col1)
print(col2)
print(col3)
print(col4)

Output:
[1, 5, 9, 13]
[2, 6, 10, 14]
[3, 7, 11, 15]
[4, 8, 12, 16]
Sotavento
fuente
4

Una forma más de usar 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])
Shashwat
fuente
3

Si tiene una matriz bidimensional en Python (no numpy), puede extraer todas las columnas de esta manera,

data = [
['a', 1, 2], 
['b', 3, 4], 
['c', 5, 6]
]

columns = list(zip(*data))

print("column[0] = {}".format(columns[0]))
print("column[1] = {}".format(columns[1]))
print("column[2] = {}".format(columns[2]))

Ejecutar este código producirá,

>>> print("column[0] = {}".format(columns[0]))
column[0] = ('a', 'b', 'c')

>>> print("column[1] = {}".format(columns[1]))
column[1] = (1, 3, 5)

>>> print("column[2] = {}".format(columns[2]))
column[2] = (2, 4, 6)

Por supuesto, puede extraer una sola columna por índice (por ejemplo columns[0])

Russell
fuente
2

A pesar de usar zip(*iterable)para transponer una lista anidada, también puede usar lo 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)
Lorenz Lo Sauer
fuente
2

Bueno, un poco tarde ...

En caso de que el rendimiento sea importante y sus datos tengan una forma rectangular, también puede almacenarlos en una dimensión y acceder a las columnas mediante cortes regulares, por ejemplo ...

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 esto es realmente rápido. ¡Sin embargo , los índices negativos no funcionan aquí! Por lo tanto, no puede acceder a la última columna o fila por el índice -1.

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

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]
Zappotek
fuente
Verifiqué este método y el costo de recuperar 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.
Zhongjun 'Mark' Jin
2

Si desea capturar más de una columna, simplemente use slice:

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

Prefiero la siguiente pista: tener la matriz nombrada matrix_ay usar column_number, por ejemplo:

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

# you can get the row from transposed matrix - it will be a column:
col=matrix_a.transpose()[column_number]
Vik Ermolenko
fuente
1

Simplemente use transpose (), luego puede obtener las columnas tan fácil como obtener filas

matrix=np.array(originalMatrix).transpose()
print matrix[NumberOfColum]
David Tatis
fuente
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) ]
usuario136036
fuente