web-dev-qa-db-fra.com

numpy remplace les valeurs négatives dans un tableau

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

75
bph

Vous êtes à mi-chemin. Essayer:

In [4]: a[a < 0] = 0

In [5]: a
Out[5]: array([1, 2, 3, 0, 5])
117
NPE

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.

82
senderle

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]
9
Levon

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])
3
Ramon Crehuet

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]
2
Kekoa