2011-08-23 11 views

Odpowiedz

43

Jak o:

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

gdzie a ma swoją tablicę.

+1

+1 za używanie numpy – rubik

+1

+1 również zajmie kilka minut, aby zaakceptować odpowiedź – Shan

+0

@ Shan: Użycie maskowanych tablic może ominąć kopię stworzoną przez 'a [np.nonzero (a)]' - zobacz moją odpowiedź. –

0

Prostym sposobem byłoby użycie rozumienia listy, aby wykluczyć zera.

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

OP szuka rozwiązania dla numpy tablic, a nie pythonów. Tak jak w drugim komentarzu, nie zamierzam mówić, ale to nie ma znaczenia w przypadku numpy array. – JoshAdel

+0

Tytuł pytania brzmi "w tablicy numpy (lub krotki)". – Wilduck

+0

nie widziałem krotki w tytule i czytałem tylko pytanie, które mówi tablica. Stoję poprawiony +1. Skoczyłem na ciebie (i na drugą odpowiedź), ponieważ ludzie publikują rozwiązania numipowych pytań traktując je tak, jakby były listami numpy, których nie są. Jest to osobista gra dla zwierząt domowych, ponieważ nieostrożne rozwiązanie jest często szalenie bardziej wydajne. – JoshAdel

0

Można użyć wyrażenia generatora odfiltrować zer:

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

Myślę, że OP mówi o numpy tablice, a nie listy Pythona. Jest różnica, chociaż twoje rozwiązanie jest poprawne na później. Nie zamierzam przegłosować, ale tylko dlatego, że wiesz. – JoshAdel

+0

Ahh, właśnie zobaczyłem tablicę, nie widziałem tagu numpy. –

15

Jeśli można wybrać „nieważny” wartość w macierzy, to lepiej jest użyć nan zamiast 0:

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

Jeśli nie jest to możliwe, można użyć maski tablicy:

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

W porównaniu z Josh's answer using advanced indexing ma to tę zaletę, że unika tworzenia kopii tablicy.

+0

co to jest ... nie jest to kolejna kopia? – Shan

+0

+1 Zamaskowane tablice są kolejnym ładnym (i często niedostatecznie wykorzystywanym) rozwiązaniem – JoshAdel

+2

@Sven: kiedy robię 'ma.base is a' otrzymuję false, więc nie wygląda to tak, jakby' ma' było po prostu widokiem 'a 'i gdzieś jest kopia pamięci. Czy testuję to w niewłaściwy sposób? – JoshAdel

2

Oto kolejny sposób maskowania, który, jak sądzę, jest łatwiejszy do zapamiętania (chociaż kopiuje tablicę). W przypadku, w momencie, to idzie tak:

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

To uogólnia się do innych określeń takich jak> 0, numpy.isnan (a) ... I można połączyć z maski standardowych operatorów (+ oznacza OR, * oznacza ORAZ - oznacza NIE) np .:

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