Numpy - 用NaN替换数字
我想在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)
这样做会创建一个新的副本(和 A[A==NDV]=np.nan
不一样),在某些情况下这可能会很有用。比如,如果数组最开始是整数类型,那在替换成 NaN 的时候,它必须转换成浮点数组(因为如果不这样做,替换就无法进行),而 np.where
可以处理这个转换。
79
A[A==NDV]=numpy.nan
A==NDV 会生成一个布尔数组,这个数组可以用来作为 A 的索引。