Je suis un novice en Python. Lors d'un exercice, je suis censé utiliser un masque pour multiplier par 2 toutes les valeurs inférieures à 100 dans la liste suivante:
import numpy as np a = np.array([230, 10, 284, 39, 76]) cut = 100 a[a < cut] = a*2
J'ai donc écrit le code suivant:
a = np.array([230, 10, 284, 39, 76])
4 Réponses :
J'ai presque raison;
a[a < cut] *= 2
Il effectuera l'opération sur place, vous multipliez un tableau entier par deux et essayez de le "mettre dans "l'espace a
Vous ne savez pas exactement ce que vous voulez, si vous voulez attribuer des endroits où Ou Pour multiplier les éléments sélectionnés par 2. un a a [a In [1]: a = np.array([230, 10, 284, 39, 76])
In [2]: a[a < cut] = a[a < cut] * 2
In [3]: a
Out[3]: array([230, 20, 284, 78, 152])
In [1]: a = np.array([230, 10, 284, 39, 76])
In [2]: a[a < cut] = 999
In [3]: a
Out[3]: array([230, 999, 284, 999, 999])
Votre erreur semble avoir été produite par a [a] et non par a[a:
In [506]: a[mask] *= 2
Mais regarder à l'affectation prévue:
In [503]: a[mask] = a[mask]*2 In [504]: a Out[504]: array([230, 20, 284, 78, 152])
Ainsi, le masque sélectionne 3 des 5 éléments de a : p >
In [502]: a[mask] = a*2 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-502-3df3d7d2d307> in <module>() ----> 1 a[mask] = a*2 ValueError: NumPy boolean array indexing assignment cannot assign 5 input values to the 3 output values where the mask is true
a * 2 multiplie tous les éléments de a , produisant un tableau à 5 éléments
In [501]: a*2 Out[501]: array([460, 20, 568, 78, 152])
Merci pour la réponse, c'était très utile!
Alternativement, une fois le masque défini, vous pouvez utiliser numpy.where ou numpy.putmask
np.putmask(a, mask, a*2) a #=> [230 20 284 78 152]
Le premier ne change pas le tableau d'origine:
res = np.where(mask, a*2,a) a #=> [230 10 284 39 76] res #=> [230 20 284 78 152]
Le second modifie le tableau d'origine:
import numpy as np a = np.array([230, 10, 284, 39, 76]) cut = 100 mask = a < cut # defines the mask
Merci, je vais essayer ça
Vous pouvez également afficher un * 2 comme multiplication avec chaque valeur du tableau, ce qui le rend cohérent.
Ce code n'a pas produit l'erreur signalée.