Extraction de colonnes spécifiques dans un tableau numpy


164

C'est une question facile mais disons que j'ai une matrice MxN. Tout ce que je veux faire est d'extraire des colonnes spécifiques et de les stocker dans un autre tableau numpy mais j'obtiens des erreurs de syntaxe invalides. Voici le code:

extractedData = data[[:,1],[:,9]]. 

Il semble que la ligne ci-dessus devrait suffire, mais je suppose que non. J'ai regardé autour de moi, mais je n'ai rien trouvé de syntaxe concernant ce scénario spécifique.

Réponses:


272

Je suppose que vous vouliez des colonnes 1et 9? C'est

data[:, [1, 9]]

Ou avec des noms:

data[:, ['Column Name1','Column Name2']]

Vous pouvez obtenir les noms de data.dtype.names


Comment faire cela avec les noms de colonnes?
Zelphir Kaltstahl

9
data [:, ['Column Name1', 'Column Name2']]
code-assassin

est-ce une vue ou une copie? mon goulot d'étranglement est sur cette ligne Je recherche un moyen d'optimiser
Fractale

1
se pourrait-il que cette fonction ne fonctionne plus?
PV8 du

Comment s'appelle cette syntaxe?
Burrito le

29

En supposant que vous souhaitiez obtenir les colonnes 1 et 9 avec cet extrait de code, cela devrait être:

extractedData = data[:,[1,9]]

14

si vous ne souhaitez extraire que quelques colonnes:

idx_IN_columns = [1, 9]
extractedData = data[:,idx_IN_columns]

si vous souhaitez exclure des colonnes spécifiques:

idx_OUT_columns = [1, 9]
idx_IN_columns = [i for i in xrange(np.shape(data)[1]) if i not in idx_OUT_columns]
extractedData = data[:,idx_IN_columns]

9

Une chose que je voudrais souligner est que si le nombre de colonnes que vous souhaitez extraire est de 1, la matrice résultante ne sera pas une matrice Mx1 comme vous pouvez vous y attendre, mais plutôt un tableau contenant les éléments de la colonne que vous avez extraite.

Pour le convertir en matrice, la méthode reshape (M, 1) doit être utilisée sur le tableau résultant.


2
Vous pouvez également y parvenir en utilisant un signe deux-points, par exemple data[:, 8:9]. Cela prend la huitième colonne mais ne supprime pas la dimension supplémentaire.
Jan Kukacka

data [:, 8] choisira également la 8e colonne et renverra une matrice
Mx1

5

Juste:

>>> m = np.matrix(np.random.random((5, 5)))
>>> m
matrix([[0.91074101, 0.65999332, 0.69774588, 0.007355  , 0.33025395],
        [0.11078742, 0.67463754, 0.43158254, 0.95367876, 0.85926405],
        [0.98665185, 0.86431513, 0.12153138, 0.73006437, 0.13404811],
        [0.24602225, 0.66139215, 0.08400288, 0.56769924, 0.47974697],
        [0.25345299, 0.76385882, 0.11002419, 0.2509888 , 0.06312359]])
>>> m[:,[1, 2]]
matrix([[0.65999332, 0.69774588],
        [0.67463754, 0.43158254],
        [0.86431513, 0.12153138],
        [0.66139215, 0.08400288],
        [0.76385882, 0.11002419]])

Les colonnes n'ont pas besoin d'être dans l'ordre:

>>> m[:,[2, 1, 3]]
matrix([[0.69774588, 0.65999332, 0.007355  ],
        [0.43158254, 0.67463754, 0.95367876],
        [0.12153138, 0.86431513, 0.73006437],
        [0.08400288, 0.66139215, 0.56769924],
        [0.11002419, 0.76385882, 0.2509888 ]])

2

Une autre chose à laquelle vous devez faire attention lors de la sélection de colonnes dans le tableau ND en utilisant une liste comme celle-ci:

data[:,:,[1,9]]

Si vous supprimez une dimension (en sélectionnant une seule ligne, par exemple), le tableau résultant sera (pour une raison quelconque) permuté . Alors:

print data.shape            # gives [10,20,30]
selection = data[1,:,[1,9]]
print selection.shape       # gives [2,20] instead of [20,2]!!

1

Vous pouvez utiliser :

extracted_data = data.ix[:,['Column1','Column2']]


2
Une bonne réponse aura toujours une explication de ce qui a été fait et pourquoi cela a été fait de cette manière, non seulement pour le PO mais pour les futurs visiteurs de SO. Veuillez ajouter une description pour faire comprendre aux autres.
Rucha Bhatt Joshi

-1

Je pense que la solution ici ne fonctionne plus avec une mise à jour de la version python, une façon de le faire avec une nouvelle fonction python est:

extracted_data = data[['Column Name1','Column Name2']].to_numpy()

ce qui vous donne le résultat souhaité.

La documentation que vous pouvez trouver ici: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html#pandas.DataFrame.to_numpy


la question commence par un tableau numpy, pas une dataframe
TMrtSmith

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.