web-dev-qa-db-fra.com

Trouvez le min / max excluant les zéros dans un tableau numpy (ou un Tuple) dans python

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.

41
Shan

Que diriez-vous:

import numpy as np
minval = np.min(a[np.nonzero(a)])
maxval = np.max(a[np.nonzero(a)])

a est votre tableau.

72
JoshAdel

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.

20
Sven Marnach

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]
3
uniomni

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
1
Wilduck

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)
1
Chris Pickett