Numpy indice de tranche sans perdre la dimension de l'information
Je suis en utilisant numpy et souhaitez indice d'affilée sans perdre la dimension de l'information.
import numpy as np
X = np.zeros((100,10))
X.shape # >> (100, 10)
xslice = X[10,:]
xslice.shape # >> (10,)
Dans cet exemple xslice est maintenant à 1 dimension, mais je veux qu'il soit (1,10).
Dans R, je voudrais utiliser X[10,:,drop=F]. Est-il quelque chose de semblable dans numpy. Je ne pouvais pas le trouver dans la documentation et ne pas voir une question similaire posée.
Merci!
Vous devez vous connecter pour publier un commentaire.
Il est probablement plus facile de faire
x[None, 10, :]
ou, de manière équivalente (mais plus lisible)x[np.newaxis, 10, :]
.Autant que pourquoi il n'est pas le défaut, personnellement, je trouve que d'avoir constamment des tableaux avec singleton dimensions est ennuyeux très rapidement. Je suppose que le numpy devs ressenti de la même façon.
Aussi, numpy poignée de radiodiffusion des tableaux très bien, donc il n'y a que peu de raison de conserver la dimension de la matrice de la tranche sont venus. Si vous l'avez fait, alors des choses comme:
soit ne fonctionne pas ou serait beaucoup plus difficile à mettre en œuvre.
(Ou du moins c'est mon sentiment à la numpy dev raisonnement derrière l'abandon de la dimension info pour le découpage)
x[10,:,None]
retourne un tableau de la forme(10,1)
, pas(1,10)
..None
s à côté de la tamise vous de les hacher.b
; il devrait êtreb = np.zeros((100,10))
.X[10,None]
(à l'aide de votre code à titre d'exemple).np.matmul()
ou@
). Juste obtenu brûlé par cette.matmul
je devrais probablement toujours la moueNone
là. Il n'y a aucune autre manière autour de, droite?Une autre solution est de faire
ou
La dimension d'un tableau est conservé lors de l'indexation est effectuée par une liste (ou un tableau) de l'index. C'est agréable car il vous laisse le choix entre le maintien de la dimension et de la pression.
x = np.array([[1,2,3,4]])
ensuite, si vous le trancher avecx[[0],[1,2]]
vous obtenez celui dimensionsarray([2, 3])
Mon avis est lors de la sélection de la colonne ou de la ligne de vecteurs, il est préférable de faire de la tranche simple puis d'utilisernp.reshape
, Donc, dans mon exemple, il seraitnp.reshape(x[0,[1,2]],[1,2])
X[[10]]
serait interprété commeX[10]
et la forme sera plus faible; de même,X[[10, 20]] == X[10, 20]
et la forme est encore plus petita
de forme(10, 20, 30)
, puisa[0, :, [0]]
aura la forme(1, 20)
, pas(20, 1)
, parce que, dans les derniers indices sont diffusés àa[[0], :, [0]]
qui n'est souvent pas du tout ce à quoi vous attendre! Alors quea[0, :, :1]
vous donnera(20, 1)
comme prévu. En outre, voir le commentaire ci-dessus pour l'étrange cas de bord avec un seul indice. Dans l'ensemble, il semble que cette méthode a de trop nombreux cas de bord.J'ai trouvé quelques solutions raisonnables.
1) utilisation
numpy.take(X,[10],0)
2) utilisez cette étrange indexation
X[10:11:, :]
Idéalement, ce 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...
alist[0]
et conservés lors de la trancher.slice(n, n+1)
pour l'extraction de l'indicen
) doit être accepté de répondre, comme il est le seul qui s'étend naturellement à la n-dimensionnelle cas.Voici une autre que j'aime le mieux. Au lieu de l'indexation avec un numéro unique, avec un indice de gamme. Qui est, l'utilisation
X[10:11,:]
. (Notez que10:11
ne comprend pas 11).Cela rend plus facile de comprendre avec plus de dimensions trop, pas de
None
de jongler et de trouver de l'axe de l'utilisation de l'index. Aussi, pas besoin de faire supplémentaire de tenue de livres concernant la taille du tableau, justei:i+1
pour touti
que vous auriez utilisé dans d'indexation réguliers.À ajouter à la solution d'indexation par les listes ou les tableaux par gnebehay, il est également possible d'utiliser des n-uplets:
C'est particulièrement gênant si vous êtes l'indexation par un tableau qui pourrait être d'une longueur de 1 au moment de l'exécution. Pour ce cas, il n'y a
np.ix_
: