我有 numpy 数组 heights
,其中可能有 nan
。我通过以下方式清理它:
heights = numpy.asarray([ h for h in heights if not numpy.isnan(h) ])
用这种简单/常见的方式来表达似乎是一种相当冗长的方式。为了以其他方式过滤我的数组,我经常也必须这样做,并且不得不退回到数组构建,这是有效的,但我敢打赌有更好的方法来做到这一点。例如。按范围过滤...
heights = numpy.asarray(heights[lowerBound <= heights & heights < upperBound])
在 python 中失败,其中高度仍然是一个 numpy 数组。我回过头来做...
编辑:此行的错误消息是:
TypeError:输入类型不支持 ufunc 'bitwise_and',并且无法根据转换规则“安全”将输入安全地强制转换为任何受支持的类型
/编辑
heights = numpy.asarray(heights[[h for h in heights if lowerBound <= h and h < upperBound]])
恶心。我已经使用 python 2-3 个月了,但我仍然没有真正了解如何有效且简单地使用 numpy 屏蔽系统。我来自大量使用 matlab,其中“掩码”将是一组相同形状/大小的 bool 值。例如
heights = heights(~isnan(heights));
或者……
heights(isnan(heights)) = [];
这两个看起来都 super 干净。另外,在python中失败的边界示例在matlab中工作,尽管必须将括号更改为圆括号...
heights = heights(lowerBound <= heights & heights < upperBound)
如何在 python/numpy、pythonic 或其他语言中同样优雅地编写这些简单的数据转换?
最佳答案
它的工作原理与 Matlab 完全相同,但语法略有不同
heights = heights[~np.isnan(heights)]
演示
>>> 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.])
>>>
关于python - 在 Python 数组或 numpy 数组中过滤掉 nan 或 invalid 的更简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28310332/