Numpy – Replace a number with NaN

Question:

I am looking to replace a number with NaN in numpy and am looking for a function like numpy.nan_to_num, except in reverse.

The number is likely to change as different arrays are processed because each can have a uniquely define NoDataValue. I have seen people using dictionaries, but the arrays are large and filled with both positive and negative floats. I suspect that it is not efficient to try to load all of these into anything to create keys.

I tried using the following but numpy requires that I use any() or all(). I realize that I need to iterate element wise, but hope that a built-in function can achieve this.

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

NDV is GDAL’s no data value and array is a numpy array.

Is a masked array the way to go perhaps?

Asked By: Jzl5325

||

Answers:

A[A==NDV]=numpy.nan

A==NDV will produce a boolean array that can be used as an index for A

Answered By: Paul

You can also use np.where to replace a number with NaN.

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

For example, the following result can be obtained via

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

res

This creates a new copy (unlike A[A==NDV]=np.nan) but in some cases that could be useful. For example, if the array was initially an int dtype, it will have to converted into a float array anyway (because replacing values with NaN won’t work otherwise) and np.where can handle that.

Answered By: cottontail
Categories: questions Tags: , , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.