在python中找到numpy数组(或元组)中的最小/最大排除零

Sha*_*han 44 python numpy

我有一个阵列.有效值不为零(正或负).我想在数组中找到不应该考虑零的最小值和最大值.例如,如果数字只是负数.零会有问题.

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你的阵列在哪里

  • @Shan:使用屏蔽数组可以避免由 `a[np.nonzero(a)]` 创建的副本 - 请参阅我的答案。 (3认同)
  • +1也需要几分钟才能接受答案 (2认同)

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的答案相比,这具有避免创建阵列副本的优点.

  • @Sven:当我做的时候`ma.base是一个`我得到了假,所以它看起来不像`ma`只是一个`a`的视图,并且在某个地方有一个内存的副本.或者我是以错误的方式测试的? (2认同)
  • @JoshAdel:默认情况下,[np.ma.masked_equal](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.masked_equal.html#numpy.ma.masked_equal) 复制`一个`。要获得视图,请使用`ma = np.ma.masked_equal(a, 0.0, copy=False)`。 (2认同)

小智 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)


Ehs*_*san 6

一般来说,掩码数组就是专门为此类目的而设计的。您可以利用数组中的掩码零(或您想要的任何其他类型的掩码,甚至是比简单等式更复杂的掩码),并在掩码数组上执行您在常规数组上执行的几乎大部分操作。您还可以指定您希望查找最小值的轴:

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)