J'utilise numpy et je souhaite indexer une ligne sans perdre les informations de dimension.
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, j'utiliserais X [10,:, drop = F]. Y a-t-il quelque chose de similaire dans numpy. Je n'ai pas pu le trouver dans la documentation et je n'ai pas vu une question similaire posée.
Merci!
x[None, 10]
fera ce que vous voulez.None
s à côté des dims que vous hachez.b
; ça devrait êtreb = np.zeros((100,10))
.X[10,None]
(en utilisant votre code comme exemple).np.matmul()
ou@
). Je viens de me brûler.Une autre solution est de faire
ou
La dimensionnalité d'un tableau est préservée lorsque l'indexation est effectuée par une liste (ou un tableau) d'index. C'est bien car cela vous laisse le choix entre garder la dimension et serrer.
la source
x = np.array([[1,2,3,4]])
si vous le découpez ensuite avecx[[0],[1,2]]
vous obtenez le unidimensionnel.Monarray([2, 3])
avis est que lors de la sélection de vecteurs de colonnes ou de lignes, il est préférable de simplifier la tranche, puis de l'utilisernp.reshape
, donc dans mon exemple, ce seraitnp.reshape(x[0,[1,2]],[1,2])
X[[10]]
serait interprété commeX[10]
et la forme sera plus petite; de même,X[[10, 20]] == X[10, 20]
et la forme est encore plus petitea
de la forme(10, 20, 30)
, alorsa[0, :, [0]]
aura la forme(1, 20)
, non(20, 1)
, car dans ces derniers sont diffusés des index àa[[0], :, [0]]
ce qui n'est souvent pas tout à fait ce que vous attendez! Alors quea[0, :, :1]
vous donnera(20, 1)
comme prévu. De plus, voir le commentaire ci-dessus pour un cas de bord étrange avec un seul index. Dans l'ensemble, il semble que cette méthode comporte trop de cas extrêmes.J'ai trouvé quelques solutions raisonnables.
1) utiliser
numpy.take(X,[10],0)
2) Utilisez cette étrange indexation
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 ...
la source
alist[0]
et conservées lors de leur découpage.slice(n, n+1)
pour l'extraction d'indexn
) devrait être la réponse acceptée, car c'est la seule qui s'étend naturellement au cas à n dimensions.X[10:11, :]
dans Python 3.7.5 (c'est-à-dire sans les deux points supplémentaires après le 11)Voici une alternative que j'aime mieux. Au lieu d'indexer avec un seul nombre, indexez avec une plage. Autrement dit, utilisez
X[10:11,:]
. (Notez que10:11
n'inclut pas 11).Cela facilite également la compréhension avec plus de dimensions, non
None
jonglage et de déterminer quel axe utiliser quel index. Il n'est pas non plus nécessaire de faire une comptabilité supplémentaire concernant la taille du tableau, justei:i+1
pour cellesi
que vous auriez utilisées dans l'indexation régulière.la source
Pour ajouter à la solution d'indexation par listes ou tableaux par gnebehay, il est également possible d'utiliser des tuples:
la source
Ceci est particulièrement ennuyeux si vous indexez par un tableau qui peut être de longueur 1 au moment de l'exécution. Pour ce cas, il y a
np.ix_
:la source