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.

Aladdin
la source

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

Fred Foo
la source
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]]
Michael J. Barber
la source
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]
queise
la source
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.

Daksh
la source
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 ]])
yanhh
la source
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]!!
Jan Kukacka
la source
1

Vous pouvez utiliser :

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

Rahul
la source
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

PV8
la source
la question commence par un tableau numpy, pas une dataframe
TMrtSmith
-3

vous pouvez également utiliser extraitData = data ([:, 1], [:, 9])

Pranav Mahajan
la source