更简单的方法来过滤掉Python数组或numpy数组中的nan或invalid?

use*_*886 2 python arrays matlab numpy python-2.7

我有heights可能有nan它的numpy数组.我通过这样做来清理它:

heights = numpy.asarray([ h for h in heights if not numpy.isnan(h) ])
Run Code Online (Sandbox Code Playgroud)

这似乎是表达这种简单/常见事物的相当冗长的方式.我经常必须这样做以便以其他方式过滤我的阵列,并且必须回到阵列构建,这有效,但我敢打赌有更好的方法来做到这一点.例如按范围过滤......

heights = numpy.asarray(heights[lowerBound <= heights & heights < upperBound])
Run Code Online (Sandbox Code Playgroud)

在python中失败,高度仍然是一个numpy数组.我回到做......

编辑:此行的错误消息是:

TypeError:输入类型不支持ufunc'bitwise_and',根据强制转换规则''safe',输入无法安全地强制转换为任何支持的类型

/编辑

heights = numpy.asarray(heights[[h for h in heights if lowerBound <= h and h < upperBound]])
Run Code Online (Sandbox Code Playgroud)

毛.我现在已经使用python 2-3个月,但我仍然没有真正得到如何有效和简单地使用numpy masking系统.我来自大量使用matlab,其中"面具"将是一组相同形状/大小的布尔.例如

heights = heights(~isnan(heights));
Run Code Online (Sandbox Code Playgroud)

或者......

heights(isnan(heights)) = [];
Run Code Online (Sandbox Code Playgroud)

这两个看起来都很干净.此外,在python中失败的bounds示例在matlab中工作,尽管括号必须更改为括号...

heights = heights(lowerBound <= heights & heights < upperBound)
Run Code Online (Sandbox Code Playgroud)

我怎样才能在python/numpy,pythonic或其他方面优雅地编写这些简单的数据转换?

YXD*_*YXD 6

它的工作方式与Matlab完全相同,但语法略有不同

heights = heights[~np.isnan(heights)]
Run Code Online (Sandbox Code Playgroud)

演示

>>> import numpy as np
>>> heights = np.array([1.0, 3.0, np.nan, -10.0])
>>> np.asarray([ h for h in heights if not np.isnan(h) ])
array([  1.,   3., -10.])
>>> heights[~np.isnan(heights)]
array([  1.,   3., -10.])
>>>
Run Code Online (Sandbox Code Playgroud)

  • 可能还值得一提的是"np.isfinite",它将过滤NaN,Inf等等.对于OP的情况,"高度[np.isfinite(高度)]`.当然,如果你想将+/- Inf保持为有效值,你需要`~np.isnan(data)`而不是`isfinite`. (3认同)