294 votes

Comment extraire une colonne d'un tableau multidimensionnel ?

Quelqu'un sait-il comment extraire une colonne d'un tableau multidimensionnel en Python ?

3voto

Zappotek Points 49

Eh bien, un peu tard ...

Si les performances sont importantes et que vos données sont de forme rectangulaire, vous pouvez également les stocker en une seule 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]

Ce qui est génial, c'est que c'est très rapide. Cependant les indices négatifs ne fonctionnent pas ici ! Vous ne pouvez donc pas accéder à la dernière colonne ou ligne par l'index -1.

Si vous avez besoin d'une indexation négative, vous pouvez adapter un peu les fonctions d'accès, par ex.

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]

3voto

Molina12 Points 130

Si vous voulez saisir plus d'une colonne, utilisez simplement slice :

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

2voto

Lo Sauer Points 5469

Malgré l'utilisation de zip(*iterable) pour transposer une liste imbriquée, vous pouvez également utiliser la méthode suivante si les listes imbriquées sont de longueur différente :

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

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

2voto

Vik Ermolenko Points 44

Je préfère l'indice 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]

0voto

user136036 Points 101

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X