Numpy - 将一个数字替换为NaN

58

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

也许使用掩蔽数组是正确的方法?


2
我不确定我理解你提供的解决方案有什么问题。它不能正常工作吗? - Chris Gregg
@Chris Gregg 这个解决方案需要一些缩进,不需要返回数组(因为它是原地操作),应该避免使用 array 作为变量以避免与 np.array 混淆,但最重要的是,与典型的 numpy 索引和广播相比,速度会非常慢。 - Paul
@Paul 我的担忧是速度问题,非常感谢您下面的回答。我只是使用变量使代码更清晰,我也会避免使用数组。 - Jzl5325
2个回答

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

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


4
NaN是一种特殊的比特序列,超出了所使用数据类型的有效范围。它被用来表示缺失的数据或者数学运算错误的结果没有产生有效值。希望这有所帮助:https://en.wikipedia.org/wiki/NaN - Paul
3
请注意,A.min()A.max() 不是检查是否有效的好方法,因为它们都会返回 nan ... 如果您希望获取最小/最大值,请使用np.nanmin(A)np.nanmax(A) - Skippy le Grand Gourou
当A是只读时,这个不起作用。 - Tobia

2

你也可以使用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),但在某些情况下可能会很有用。例如,如果数组最初是int类型,则必须将其转换为float数组(因为否则无法使用NaN替换值),而np.where可以处理它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接