Найти мин / макс, исключая нули в массиве numpy (или кортеже) в python - PullRequest
37 голосов
/ 23 августа 2011

У меня есть массив. Допустимые значения не равны нулю (положительные или отрицательные). Я хочу найти минимум и максимум в массиве, который не должен принимать во внимание нули. Например, если числа только отрицательные. Нули будут проблематичными.

Ответы [ 5 ]

68 голосов
/ 23 августа 2011

Как насчет:

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

, где a - ваш массив.

20 голосов
/ 23 августа 2011

Если вы можете выбрать «недопустимое» значение в своем массиве, лучше использовать nan вместо 0:

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

Если это невозможно, вы можете использовать массивмаска:

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

По сравнению с ответом Джоша, использующим расширенное индексирование , это дает преимущество в том, что он не создает копию массива.

2 голосов
/ 06 июня 2012

Вот еще один способ маскировки, который, как мне кажется, легче запомнить (хотя он и копирует массив). Для данного случая это выглядит так:

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

Обобщает другие выражения, такие как a> 0, numpy.isnan (a), ... И вы можете комбинировать маски со стандартными операторами (+ означает ИЛИ, * означает И, - означает НЕ), например:

# 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]
1 голос
/ 23 августа 2011

Простым способом было бы использовать понимание списка, чтобы исключить нули.

>>> tup = (0, 1, 2, 5, 2)
>>> min([x for x in tup if x !=0])
1
0 голосов
/ 23 августа 2011

Вы можете использовать выражение генератора для фильтрации нулей:

array = [-2, 0, -4, 0, -3, -2]
max(x for x in array if x != 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...