我有一个阵列.有效值不为零(正或负).我想在数组中找到不应该考虑零的最小值和最大值.例如,如果数字只是负数.零会有问题.
Jos*_*del 76
怎么样:
import numpy as np
minval = np.min(a[np.nonzero(a)])
maxval = np.max(a[np.nonzero(a)])
Run Code Online (Sandbox Code Playgroud)
a你的阵列在哪里
Sve*_*ach 21
如果您可以在数组中选择"无效"值,最好使用nan而不是0:
>>> a = numpy.array([1.0, numpy.nan, 2.0])
>>> numpy.nanmax(a)
2.0
>>> numpy.nanmin(a)
1.0
Run Code Online (Sandbox Code Playgroud)
如果无法做到这一点,您可以使用数组掩码:
>>> 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
Run Code Online (Sandbox Code Playgroud)
与使用高级索引的Josh的答案相比,这具有避免创建阵列副本的优点.
小智 7
这是我认为更容易记住的另一种屏蔽方式(尽管它确实复制了数组)。对于这种情况,它是这样的:
>>> import numpy
>>> a = numpy.array([1.0, 0.0, 2.0])
>>> ma = a[a != 0]
>>> ma.max()
2.0
>>> ma.min()
1.0
>>>
Run Code Online (Sandbox Code Playgroud)
它可以推广到其他表达式,例如 a > 0、numpy.isnan(a)、...并且您可以将掩码与标准运算符组合在一起(+ 表示 OR,* 表示 AND,- 表示 NOT)例如:
# 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]
Run Code Online (Sandbox Code Playgroud)
一般来说,掩码数组就是专门为此类目的而设计的。您可以利用数组中的掩码零(或您想要的任何其他类型的掩码,甚至是比简单等式更复杂的掩码),并在掩码数组上执行您在常规数组上执行的几乎大部分操作。您还可以指定您希望查找最小值的轴:
import numpy.ma as ma
mx = ma.masked_array(x, mask=x==0)
mx.min()
Run Code Online (Sandbox Code Playgroud)
输入示例:
x = np.array([1.0, 0.0, 2.0])
Run Code Online (Sandbox Code Playgroud)
输出:
1.0
Run Code Online (Sandbox Code Playgroud)