2010-08-23 5 views
45

J'utilise numpy et je souhaite indexer une ligne sans perdre les informations de cote.Section d'index Numpy sans perte d'informations sur les cotes

import numpy as np 
X = np.zeros((100,10)) 
X.shape  # >> (100, 10) 
xslice = X[10,:] 
xslice.shape # >> (10,) 

Dans cet exemple, xslice a maintenant une dimension, mais je veux qu'il soit (1,10). Dans R, j'utiliserais X [10,:, drop = F]. Y a-t-il quelque chose de similaire en numpy? Je n'ai pas pu le trouver dans la documentation et je n'ai pas vu une question similaire posée.

Merci!

Répondre

29

Il est probablement plus facile de faire x[None, 10, :] ou de manière équivalente (mais plus lisible) x[np.newaxis, 10, :].

En ce qui concerne pourquoi ce n'est pas la valeur par défaut, personnellement, je trouve que constamment avoir des tableaux avec des dimensions singleton devient ennuyeux très rapidement. J'imagine que les développeurs numériques ont ressenti la même chose.

De plus, les tableaux de diffusion de type numpy handle fonctionnent très bien, donc il n'y a généralement pas de raison de conserver la dimension du tableau dont provient la tranche. Si vous avez fait, alors des choses comme:

a = np.zeros((100,100,10)) 
b = np.zeros(100,10) 
a[0,:,:] = b 

soit ne fonctionnerait pas ou serait beaucoup plus difficile à mettre en œuvre.

(Ou du moins c'est je pense au raisonnement de dev numpy derrière chute information de la dimension lors du tranchage)

+4

Cela semble si faux ... – sebpiq

+1

En fait, 'x [10,:, None]' renvoie un tableau de forme '(10,1)', pas '(1,10)' .. – Lisa

+4

@Lisa: 'x [Aucun, 10] 'fera ce que vous voulez. – naught101

13

J'ai trouvé quelques solutions raisonnables.

1) utilisent numpy.take(X,[10],0)

2) utilisent cette indexation étrange X[10:11:, :]

Idéalement, cela devrait être la valeur par défaut. Je n'ai jamais compris pourquoi les dimensions sont jamais abandonnées. Mais c'est une discussion pour numpy ...

+0

L'option 2 est plutôt géniale. –

38

Une autre solution consiste à faire

X[[10],:] 

ou

I = array([10]) 
X[I,:] 

La dimensionnalité un tableau est conservé lorsque l'indexation est effectuée par une liste (ou un tableau) d'index. C'est bien parce que ça vous laisse le choix entre garder la dimension et presser.

+5

C'est de loin la meilleure solution. – Will

+1

Ceci copie les données de la matrice – Per

+0

Ce n'est pas toujours le cas. Voir: 'x = np.array ([[1,2,3,4]])' si vous le découpez ensuite avec 'x [[0], [1,2]]' vous obtenez le tableau en une dimension ' ([2, 3]) 'A mon avis, quand on sélectionne des vecteurs de colonnes ou de lignes, il est préférable de rendre la tranche simple, puis d'utiliser' np.reshape', donc dans mon exemple ce serait 'np.reshape (x [0, [ 1,2]], [1,2]) ' – Alexander

Questions connexes