2011-08-23 67 views

Respuesta

43

¿Qué tal:

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

donde a es su matriz.

+1

+1 para usar numpy – rubik

+1

+1 también tomará algunos minutos para aceptar la respuesta – Shan

+0

@ Shan: El uso de matrices enmascaradas puede evitar la copia creada por 'a [np.nonzero (a)]' - ver mi respuesta. –

0

Una manera simple sería usar una lista de comprensión para excluir ceros.

>>> tup = (0, 1, 2, 5, 2) 
>>> min([x for x in tup if x !=0]) 
1 
+0

OP está buscando una solución para matrices numpy, no tuplas de pitón. Como en el otro comentario, no voy a downvote, pero esto no es relevante para matrices numpy. – JoshAdel

+0

El título de la pregunta dice "en una matriz numpy (o una tupla)". – Wilduck

+0

no vi tupla en el título y solo leí la pregunta que dice matriz. Me corresponde corregido +1. Salté sobre ti (y la otra respuesta), porque la gente publica soluciones a preguntas numpy tratándolos como si fueran listas numpy, que no lo son. Es un motivo de preocupación personal, ya que la solución numpy a menudo es mucho más eficiente. – JoshAdel

0

Se podría utilizar una expresión generador para filtrar los ceros:

array = [-2, 0, -4, 0, -3, -2] 
max(x for x in array if x != 0) 
+1

Creo que OP está hablando de matrices numpy y no de listas de Python. Hay una diferencia, aunque su solución es correcta para el posterior. No va a downvote, pero solo para que lo sepas. – JoshAdel

+0

Ahh, acabo de ver una matriz, no vi la etiqueta numpy. –

15

Si se puede elegir el valor "no válido" en su conjunto, es mejor utilizar nan en lugar de 0:

>>> a = numpy.array([1.0, numpy.nan, 2.0]) 
>>> numpy.nanmax(a) 
2.0 
>>> numpy.nanmin(a) 
1.0 

Si esto no es posible, se puede utilizar una máscara de matriz:

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

Comparado con Josh's answer using advanced indexing, esto tiene la ventaja de evitar crear una copia de la matriz.

+0

¿Qué es esta ma ... no es otra copia? – Shan

+0

+1 Las matrices enmascaradas son otra solución agradable (ya menudo no utilizada) – JoshAdel

+2

@Sven: cuando 'ma.base es un' obtengo falso, por lo que no parece 'ma' es solo una vista de' a 'y hay una copia de la memoria en alguna parte. ¿O estoy probando esto de la manera incorrecta? – JoshAdel

2

Aquí hay otra forma de enmascarar que creo que es más fácil de recordar (aunque sí copia la matriz). Para el caso en cuestión, que es la siguiente:

>>> import numpy 
>>> a = numpy.array([1.0, 0.0, 2.0]) 
>>> ma = a[a != 0] 
>>> ma.max() 
2.0 
>>> ma.min() 
1.0 
>>> 

Se generaliza a otras expresiones como a> 0, numpy.isnan (a), ... Y puede combinar con máscaras operadores estándar (+ significa O, * significa AND, - significa NO) eg:

# 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] 
Cuestiones relacionadas