Numpy - 用 NaN 替换数字

Posted

技术标签:

【中文标题】Numpy - 用 NaN 替换数字【英文标题】:Numpy - Replace a number with NaN 【发布时间】:2011-10-05 19:32:29 【问题描述】:

我希望在 numpy 中用 NaN 替换一个数字,并且正在寻找一个类似 numpy.nan_to_num 的函数,但反向除外。

随着处理不同的数组,该数字可能会发生变化,因为每个数组都可以具有唯一定义的 NoDataValue。我见过人们使用字典,但是数组很大并且充满了正负浮点数。我怀疑尝试将所有这些都加载到任何东西中来创建密钥效率不高。

我尝试使用以下和 numpy 要求我使用 any() 或 all()。我意识到我需要明智地迭代元素,但希望内置函数可以实现这一点。

def replaceNoData(scanBlock, NDV):
    for n, i in enumerate(array):
        if i == NDV:
            scanBlock[n] = numpy.nan

NDV 是 GDAL 的无数据值,array 是一个 numpy 数组。

掩码数组是否可行?

【问题讨论】:

我不确定我是否理解您提供的解决方案有什么问题。它不能正常工作吗? @Chris Gregg 这个解决方案需要一些缩进,不需要返回数组(因为它是就地的),应该避免使用array作为变量以避免与np.array混淆,但最重要的是,与典型的 numpy 索引和广播相比,速度会非常慢。 @Paul 我关心的是速度,非常感谢下面的回答。我使用变量只是为了使代码更清晰,我也会避免使用数组。 【参考方案1】:
A[A==NDV]=numpy.nan

A==NDV 将生成一个布尔数组,可用作 A 的索引

【讨论】:

这是一个特殊的位序列,超出了所用数据类型的有效范围。它用于表示丢失的数据或未产生有效值的数学错误的结果。希望这会有所帮助:en.wikipedia.org/wiki/NaN 请注意A.min()A.max() 不是检查它是否有效的好方法,因为它们都会返回nan...如果你想获得最小值/最大值,请使用np.nanmin(A)np.nanmax(A).

以上是关于Numpy - 用 NaN 替换数字的主要内容,如果未能解决你的问题,请参考以下文章

用一系列非数字对象中最接近的值替换 NaN?

用 NaN 替换选择性数字

用 nan 替换 NumPy 整数数组中的零

Julia:用数组中的字符串替换数字

numpy nan和inf

用等效字母替换矩阵中的所有数字