web-dev-qa-db-fra.com

Comment extraire une colonne d'un tableau multi-dimensionnel?

Est-ce que quelqu'un sait comment extraire une colonne d'un tableau multidimensionnel en Python?

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

Voir aussi: "numpy.arange" et "remodeler" pour allouer de la mémoire.

Exemple: (Allouer un tableau avec mise en forme de la matrice (3x4))

nrows = 3
ncols = 4
my_array = numpy.arange(nrows*ncols, dtype='double')
my_array = my_array.reshape(nrows, ncols)
184
Andre Luiz

Se pourrait-il que vous utilisiez un tableau NumPy ? Python a le module array , mais cela ne supporte pas les tableaux multidimensionnels. Les listes normales Python sont également monodimensionnelles.

Cependant, si vous avez une simple liste à deux dimensions comme celle-ci:

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

alors vous pouvez extraire une colonne comme ceci:

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

Extraction de la deuxième colonne (index 1):

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

Ou bien simplement:

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

Si vous avez un tableau comme

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

Ensuite, vous extrayez la première colonne comme ça:

[row[0] for row in a]

Donc, le résultat ressemble à ceci:

[1, 2, 3]
69
Andrei Arsenin

vérifiez-le!

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

c'est la même chose que ci-dessus sauf que d'une manière ou d'une autre il est plus net que le Zip fasse le travail mais nécessite des tableaux simples en tant qu'arguments, la syntaxe * a décompresse le tableau multidimensionnel en arguments à tableau unique

34
Mac D
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 fonction map dans Python est une autre solution.

13
Peter Paul
>>> 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 vous voulez la deuxième colonne, vous pouvez utiliser

>>> x[:, 1]
array([ 1,  6, 11, 16])
10
simomod
[matrix[i][column] for i in range(len(matrix))]
9
renatov

L'opérateur itemgetter peut aussi vous aider, si vous aimez le style python de type carte réduit, plutôt que la compréhension de liste, pour un peu de variété!

# 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)
8
Gregg Lind

Vous pouvez aussi utiliser ceci:

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

Remarque: cela ne fonctionne pas pour le tableau intégré et n'est pas aligné (par exemple, np.array ([[1,2,3], [4,5,6,7]]))

7
Sergey

disons que nous avons n X m matrice (n lignes et m colonnes) disons 5 lignes et 4 colonnes

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

Pour extraire les colonnes en python, nous pouvons utiliser une compréhension de liste comme celle-ci

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

Vous pouvez remplacer 4 par le nombre de colonnes de votre matrice. Le résultat est

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

6
Serge_k

Je pense que vous voulez extraire une colonne d'un tableau tel qu'un tableau ci-dessous

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

Maintenant, si vous voulez obtenir la troisième colonne dans le format

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

Ensuite, vous devez d'abord faire du tableau une matrice

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

Et maintenant, vous pouvez faire des calculs élémentaires comme vous le feriez dans Excel.

6

Une autre façon d'utiliser des 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
Shashwat

Eh bien un peu en retard ...

Si les performances importent et que vos données ont une forme rectangulaire, vous pouvez également les stocker dans une dimension et accéder aux colonnes par découpage régulier, par exemple. ...

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 chose intéressante est que c'est vraiment rapide. Cependant, les index négatifs ne fonctionnent pas ici! Donc, vous ne pouvez pas accéder à la dernière colonne ou ligne par index -1.

Si vous avez besoin d’une indexation négative, vous pouvez régler un peu les fonctions d’accesseur, par exemple:.

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

Je préfère le conseil suivant: avoir la matrice nommée matrix_a et utiliser column_number, par exemple:

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]
2
Vik Ermolenko

Bien que vous utilisiez Zip(*iterable) pour transposer une liste imbriquée, vous pouvez également utiliser les éléments suivants si la longueur des listes imbriquées varie:

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

résulte en:

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

La première colonne est donc:

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

Toutes les colonnes d'une matrice dans une nouvelle liste:

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

Si vous voulez récupérer plus d'une colonne, utilisez slice:

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