在Python中查找numpy数组(或元组)中不包含零的最小/最大值

72 投票
6 回答
117075 浏览
提问于 2025-04-17 00:12

我有一个数组,这个数组里的有效值都不是零(可以是正数也可以是负数)。我想在这个数组中找到最小值和最大值,但不想把零算进去。比如说,如果数组里的数字全是负数,零就会造成麻烦。

6 个回答

8

这里有另一种我觉得更容易记住的遮罩方法(虽然它会复制数组)。对于这个例子,它是这样的:

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

如果你可以在数组中选择一个“无效”的值,最好用 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])
>>> masked_a = numpy.ma.masked_equal(a, 0.0, copy=False)
>>> masked_a.max()
2.0
>>> masked_a.min()
1.0

Josh 的高级索引方法 相比,这种方法的好处是避免了创建数组的副本。

122

这样写怎么样:

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

这里的 a 就是你的数组。

撰写回答