J'ai un tableau. Les valeurs valides ne sont pas nulles (positives ou négatives). Je veux trouver le minimum et le maximum dans le tableau qui ne devraient pas prendre en compte les zéros. Par exemple, si les nombres ne sont que négatifs. Les zéros seront problématiques.
Que diriez-vous:
import numpy as np
minval = np.min(a[np.nonzero(a)])
maxval = np.max(a[np.nonzero(a)])
où a
est votre tableau.
Si vous pouvez choisir la valeur "invalide" dans votre tableau, il est préférable d'utiliser nan
au lieu de 0
:
>>> a = numpy.array([1.0, numpy.nan, 2.0])
>>> numpy.nanmax(a)
2.0
>>> numpy.nanmin(a)
1.0
Si ce n'est pas possible, vous pouvez utiliser un masque de tableau:
>>> a = numpy.array([1.0, 0.0, 2.0])
>>> ma = numpy.ma.masked_equal(a, 0.0, copy=False)
>>> ma.max()
2.0
>>> ma.min()
1.0
Comparé à réponse de Josh utilisant une indexation avancée , cela a l'avantage d'éviter de créer une copie du tableau.
Voici une autre façon de masquer qui, je pense, est plus facile à retenir (bien qu'elle copie le tableau). Pour le cas d'espèce, cela se passe comme suit:
>>> import numpy
>>> a = numpy.array([1.0, 0.0, 2.0])
>>> ma = a[a != 0]
>>> ma.max()
2.0
>>> ma.min()
1.0
>>>
Il se généralise à d'autres expressions telles que a> 0, numpy.isnan (a), ... Et vous pouvez combiner des masques avec des opérateurs standard (+ signifie OU, * signifie ET, - signifie NON), par exemple:
# Identify elements that are outside interpolation domain or NaN
outside = (xi < x[0]) + (eta < y[0]) + (xi > x[-1]) + (eta > y[-1])
outside += numpy.isnan(xi) + numpy.isnan(eta)
inside = -outside
xi = xi[inside]
eta = eta[inside]
Un moyen simple serait d'utiliser une compréhension de liste pour exclure les zéros.
>>> tup = (0, 1, 2, 5, 2)
>>> min([x for x in tup if x !=0])
1
Vous pouvez utiliser une expression de générateur pour filtrer les zéros:
array = [-2, 0, -4, 0, -3, -2]
max(x for x in array if x != 0)