1
votes

attribution numpy avec masquage

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


2 commentaires

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.


4 Réponses :


1
votes

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


0 commentaires

5
votes

Vous ne savez pas exactement ce que vous voulez, si vous voulez attribuer des endroits où un contient ( a est l'index booléen), lorsque vous attribuez à a [a , vous attribuez aux endroits où l'élément est 1, ce qui signifie que sur le côté droit, il attend un tableau numpy de taille 3 (ou bien sûr un numéro). Vous pouvez faire ceci

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

Ou

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

Pour multiplier les éléments sélectionnés par 2.


0 commentaires

0
votes

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


1 commentaires

Merci pour la réponse, c'était très utile!



1
votes

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


1 commentaires

Merci, je vais essayer ça