web-dev-qa-db-fra.com

Comment supprimer un objet d'un tableau numpy sans connaître l'index

est-il possible de supprimer un objet d'un tableau numpy sans connaître l'index de l'objet mais connaître l'objet lui-même?

j'ai vu qu'il est possible d'utiliser l'index de l'objet à l'aide de la fonction np.delete, mais je cherche un moyen de le faire en ayant l'objet mais pas son index.

exemple: 

[a B c d e F]

x = e

Je voudrais supprimer x

merci d'avance

13
MhmdMnsr

Vous pouvez rechercher le ou les index de l'objet à l'aide de np.argwhere , puis supprimer les objets à l'aide de np.delete .

Exemple:

x = np.array([1,2,3,4,5])
index = np.argwhere(x==3)
y = np.delete(x, index)
print(x, y)
19
jojonas

Transformez-le en un tableau numpy, et il existe une méthode très simple:

x = np.array(list("abcdef"))

x = x[x!='e']  # <-- THIS IS THE METHOD

print x
# array(['a', 'b', 'c', 'd', 'f'])

Ne doit pas être plus compliqué que cela.

9
Ulf Aslak

L'indexation ou le masquage booléen est un bon moyen de sélectionner ou de supprimer des éléments spécifiques d'un tableau.

Vous parlez de supprimer un "objet" spécifique. Prenons cela littéralement et définissons un tableau d'objet dtype:

In [2]: x=np.array(['a','b','c','d','e'],dtype=object)
In [3]: x
Out[3]: array(['a', 'b', 'c', 'd', 'e'], dtype=object)
In [4]: x=='d'   # elements that equal 'd'
Out[4]: array([False, False, False,  True, False], dtype=bool)
In [5]: x!='d'    # elements that don't
Out[5]: array([ True,  True,  True, False,  True], dtype=bool)
In [6]: x[x!='d']   # select a subset
Out[6]: array(['a', 'b', 'c', 'e'], dtype=object)

Dans les coulisses argwhere et delete utilisent ceci. Notez que argwhere utilise le tableau x==d boolean, en le convertissant en index de tableau. Et construire un masque comme celui-ci est un moyen utilisé par delete.

Il y a quelques limites importantes:

  • ce test d'égalité (ou non d'égalité) doit fonctionner pour vos valeurs. Cela pourrait ne pas être le cas si les éléments sont des éléments flottants.

  • la suppression d'un tableau 1d est plus facile que celle d'un tableau 2d (ou plus grand). Avec 2d, vous devez décider si vous souhaitez supprimer une ligne, une colonne ou un élément (et en aplatissant le tableau).

  • supprimer un seul élément de cette correspondance est un peu plus compliqué.

Dans certains cas, il peut être préférable de .tolist() le tableau et d’utiliser une méthode de liste.

In [32]: xl=x.tolist()
In [33]: xl.remove('d')
In [34]: np.array(xl,dtype=object)
Out[34]: array(['a', 'b', 'c', 'e'], dtype=object)

Il n'y a pas d'équivalent exact à list.remove pour les tableaux.

3
hpaulj