Numpy - 用NaN替换数字

58 投票
2 回答
193258 浏览
提问于 2025-04-16 21:34

我想在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数组。

那使用掩码数组(masked array)是不是一个好办法呢?

2 个回答

3

你也可以用 np.where 来把某个数字替换成 NaN(表示“不是一个数字”)。

arr = np.where(arr==NDV, np.nan, arr)

比如,下面这个结果可以通过以下方式得到:

arr = np.array([[1, 1, 2], [2, 0, 1]])
arr = np.where(arr==1, np.nan, arr)

res

这样做会创建一个新的副本(和 A[A==NDV]=np.nan 不一样),在某些情况下这可能会很有用。比如,如果数组最开始是整数类型,那在替换成 NaN 的时候,它必须转换成浮点数组(因为如果不这样做,替换就无法进行),而 np.where 可以处理这个转换。

79
A[A==NDV]=numpy.nan

A==NDV 会生成一个布尔数组,这个数组可以用来作为 A 的索引。

撰写回答