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

标签 python arrays matlab python-2.7 numpy

我有 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/

相关文章:

python - 在python中模拟私有(private)变量

c++ - 我如何将 'int' 的数组初始化为 c++11 中的类成员?

r - 两个结构体的猫 : not the same fields

python - 在 Python 中导入两个或多个具有相同名称的模块

python - apscheduler 在查询期间丢失与 MySQL 服务器的连接

arrays - Lua中如何迭代表?

javascript - 使用 jQuery 在 html 数组中设置一个值

matlab - 如何连接作为 MATLAB 中元胞数组一部分的元胞数组?

matlab - 什么命令在 Matlab 中执行 str2double 的反函数?

python - Opencv和python获取正确的文档构建并绘制图像