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

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]

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]

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


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.


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

1
Esto está usando numpy?
Foreever

1
No puedo encontrar ninguna documentación arange()en Python3 fuera de numpy. ¿Nadie?
Kevin W Matthews


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)

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


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.


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


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

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

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


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)

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]

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

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]

1

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

matrix=np.array(originalMatrix).transpose()
print matrix[NumberOfColum]

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) ]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.