我有一个数组。有效值不为零(正数或负数)。我想在不考虑零的情况下找到数组中的最小值和最大值。例如,如果数字仅为负数,则零将会成为问题。
这样怎么样:
import numpy as np
minval = np.min(a[np.nonzero(a)])
maxval = np.max(a[np.nonzero(a)])
其中a
是你的数组。
a[np.nonzero(a)]
所创建的副本--请参考我的答案。 - Sven Marnach如果你的数组中可以选择“无效”值,最好使用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
ma.base is a
时,返回 false,因此看起来 ma
不仅仅是 a
的视图,而且内存中还有一份副本。或者我测试的方式不对吗? - JoshAdela
。要获取一个视图,请使用ma = np.ma.masked_equal(a, 0.0, copy=False)
。 - unutbuma
)的命名与用于创建它的模块(numpy.ma
)相同,对于试图理解此代码的人来说是不必要的混淆,当它可以被命名为任何其他更具描述性的名称。例如,为什么不使用a_view
? - Brunox13masked_a
。 - Sven Marnach这里提供另一种掩码的方法,我认为更易于记忆(尽管它会复制数组)。对于本例,步骤如下:
>>> 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), ... 您可以使用标准运算符(+表示 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]
掩码数组 通常是专门为这些目的而设计的。您可以利用从数组中遮蔽零(或任何其他类型的遮罩,甚至比简单的相等性更复杂的遮罩),并且可以在掩码数组上执行大部分正常数组上执行的操作。您还可以指定要沿其查找最小值的轴:
import numpy.ma as ma
mx = ma.masked_array(x, mask=x==0)
mx.min()
示例输入:
x = np.array([1.0, 0.0, 2.0])
输出:
1.0
您可以使用生成器表达式来过滤掉零:
array = [-2, 0, -4, 0, -3, -2]
max(x for x in array if x != 0)
一个简单的方法是使用列表推导式来排除零。
>>> tup = (0, 1, 2, 5, 2)
>>> min([x for x in tup if x !=0])
1