Dans un tableau numpy donné X
:
X = array([1,2,3,4,5,6,7,8,9,10])
Je voudrais remplacer les index (2, 3)
et (7, 8)
par un seul élément -1
, comme ceci:
X = array([1,2,-1,5,6,7,-1,10])
En d'autres termes, j'ai remplacé les valeurs des index (2, 3)
et (7,8)
du tableau d'origine par une valeur singulière.
La question est: existe-t-il une manière numpy-ish (c'est-à-dire sans boucles for et utilisation de listes python) autour de celle-ci? Merci.
Remarque: cela n'équivaut pas à remplacer un seul élément sur place par un autre. Il s’agit de remplacer plusieurs valeurs par une valeur "singulière". Merci.
Essayez np.put
:
np.put(X, [2,3,7,8], [-1,0]) # `0` can be changed to anything that's not in the array
print(X[X!=0]) # whatever You put as an number in `put`
Donc, fondamentalement, utilisez put
pour créer les valeurs des index, puis supprimez les valeurs zéro.
Ou, comme @khan le dit, peut faire quelque chose qui est hors de portée:
np.put(X, [2,3,7,8], [-1,np.max(X)+1])
print(X[X!=X.max()])
Toutes les sorties:
[ 1 2 -1 5 6 7 -1 10]
Une solution utilisant numpy.delete
, similaire à @pault, mais plus efficace car elle utilise l'indexation numpy pure. Cependant, en raison de cette indexation efficace, cela signifie que vous ne pouvez pas transmettre de tableaux en escalier en tant qu'index
Installer
a = np.array([1,2,3,4,5,6,7,8,9,10])
idx = np.stack([[2, 3], [7, 8]])
a[idx] = -1
np.delete(a, idx[:, 1:])
array([ 1, 2, -1, 5, 6, 7, -1, 10])
Je ne sais pas si cela peut être fait en une seule étape, mais voici un moyen d'utiliser np.delete
:
import numpy as np
from operator import itemgetter
X = np.array(range(1,11))
to_replace = [[2,3], [7,8]]
X[list(map(itemgetter(0), to_replace))] = -1
X = np.delete(X, list(map(lambda x: x[1:], to_replace)))
print(X)
#[ 1 2 -1 5 6 7 -1 10]
Tout d'abord, nous remplaçons le premier élément de chaque paire par -1
. Ensuite, nous supprimons les éléments restants.