web-dev-qa-db-fra.com

Remplacer plusieurs éléments du tableau numpy par 1

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.

14
khan

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]
1
U9-Forward

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])
6
user3483203

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.

4
pault