2012-01-03 6 views
4

Existe-t-il un moyen en numpy pour récupérer tous les éléments d'un tableau à l'exception de l'élément de l'index fourni.Index du tableau en numpy

x = 
array([[[4, 2, 3], 
    [2, 0, 1], 
    [1, 3, 4]], 

    [[2, 1, 2], 
    [3, 2, 3], 
    [3, 4, 2]], 

    [[2, 4, 1], 
    [0, 2, 2], 
    [4, 0, 0]]]) 

et en demandant

x[not 1,:,:] 

vous obtiendrez

array([[[4, 2, 3], 
    [2, 0, 1], 
    [1, 3, 4]], 

    [[2, 4, 1], 
    [0, 2, 2], 
    [4, 0, 0]]]) 

Merci

+0

Pour votre exemple simple, vous pouvez utiliser 'x [:: 2,:,:]' – wim

+0

si x alors = np.random. ranint (10, size = (1000,3,3)) et j'essaie d'obtenir une vue de la matrice sans la troisième matrice 3X3. Votre approche ne peut pas être généralisée :) – JustInTime

+0

Pour le cas général, je pense que l'indexation avec un tuple serait la plus simple .. bien qu'il y ait peut-être une magie numpy dont je ne suis pas consciente! – wim

Répondre

6
In [42]: x[np.arange(x.shape[0])!=1,:,:] 
Out[42]: 
array([[[4, 2, 3], 
     [2, 0, 1], 
     [1, 3, 4]], 

     [[2, 4, 1], 
     [0, 2, 2], 
     [4, 0, 0]]]) 
+0

+1 C'est juste magnifique! Avec 'x [np.arange (x.shape [0])! = 1,:,:]' ce serait parfait :-) – eumiro

+0

Merci pour l'amélioration, eurimo. – unutbu

+0

Je savais que unutbu entrerait avec une belle réponse :) même 'x [np.arange (x.shape [0])! = 1]' fonctionnera, les autres dims prendront ':' par défaut – wim

2

Avez-vous essayé?

a[(0,2), :, :] 

Au lieu de mettre sur liste noire ce que vous ne voulez pas obtenir, vous pouvez essayer de mettre sur liste blanche ce dont vous avez besoin.

Si vous avez besoin de la liste noire de toute façon, vous pouvez faire quelque chose comme ceci:

a[[i for i in range(a.shape[0]) if i != 1], :, :] 

Fondamentalement, vous venez de créer une liste avec tous les index possibles (range(a.shape[0])) et filtrer ceux que vous ne voulez pas obtenir affiché (if i != 1).

+0

Et si j'ai 1000 matrices 2D? devrait-il être (0,2,3,4, ...). – JustInTime

+0

@JustInTime Je ne suis pas sûr de comprendre, mais l'expression '[i for i in range (a.shape [0]) if i! = 1]' vous permettra de créer un masque pour tous les index dont vous avez besoin sauf ' 1' indépendamment du nombre de matrices en raison de l'utilisation de 'a.shape [0]'. – jcollado

2

C'est tout à fait une solution générique:

x[range(0,i)+range(i+1,x.shape[0]),:,:] 
Questions connexes