Quelqu'un peut-il conseiller un moyen simple de remplacer toutes les valeurs négatives dans un tableau avec 0?
Je vais avoir un blocage complet sur la façon de le faire en utilisant un tableau numpy
par exemple.
a = array([1, 2, 3, -4, 5])
j'ai besoin de revenir
[1, 2, 3, 0, 5]
a < 0
donne:
[False, False, False, True, False]
C'est ici que je suis coincé - comment utiliser ce tableau pour modifier le tableau d'origine
Vous êtes à mi-chemin. Essayer:
In [4]: a[a < 0] = 0
In [5]: a
Out[5]: array([1, 2, 3, 0, 5])
Essayez numpy.clip
:
>>> import numpy
>>> a = numpy.arange(-10, 10)
>>> a
array([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9])
>>> a.clip(0, 10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Vous ne pouvez couper que la moitié inférieure avec clip(0)
.
>>> a = numpy.array([1, 2, 3, -4, 5])
>>> a.clip(0)
array([1, 2, 3, 0, 5])
Vous ne pouvez couper que la moitié supérieure avec clip(max=n)
. (C'est beaucoup mieux que ma suggestion précédente, qui impliquait de passer NaN
au premier paramètre et d'utiliser out
pour contraindre le type.):
>>> a.clip(max=2)
array([ 1, 2, 2, -4, 2])
Une autre approche intéressante consiste à utiliser where
:
>>> numpy.where(a <= 2, a, 2)
array([ 1, 2, 2, -4, 2])
Enfin, considérons la réponse de aix . Je préfère clip
pour des opérations simples parce que c'est auto-documenté, mais sa réponse est préférable pour des opérations plus complexes.
Une autre solution minimaliste Python sans utiliser numpy:
[0 if i < 0 else i for i in a]
Pas besoin de définir des fonctions supplémentaires.
a = [1, 2, 3, -4, -5.23, 6]
[0 if i < 0 else i for i in a]
rendements:
[1, 2, 3, 0, 0, 6]
Et encore une autre possibilité:
In [2]: a = array([1, 2, 3, -4, 5])
In [3]: where(a<0, 0, a)
Out[3]: array([1, 2, 3, 0, 5])
Voici un moyen de le faire dans Python sans numpy. Créez une fonction qui retourne ce que vous voulez et utilisez une liste de compréhension ou la fonction map .
>>> a = [1, 2, 3, -4, 5]
>>> def zero_if_negative(x):
... if x < 0:
... return 0
... return x
...
>>> [zero_if_negative(x) for x in a]
[1, 2, 3, 0, 5]
>>> map(zero_if_negative, a)
[1, 2, 3, 0, 5]