Numpy — заменить число на NaN

Я хочу заменить число на NaN в numpy и ищу функцию, подобную 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, а массив - это пустой массив.

Может быть, замаскированный массив - это путь?


person Jzl5325    schedule 15.07.2011    source источник
comment
Я не уверен, что понимаю, что не так с решением, которое вы предоставляете. Это не работает должным образом?   -  person Chris Gregg    schedule 15.07.2011
comment
@Chris Gregg Это решение требует некоторого отступа, ему не нужно возвращать массив (поскольку он находится на месте), вероятно, следует избегать использования array в качестве переменной, чтобы избежать путаницы с np.array, но, что наиболее важно, будет ужасно медленным по сравнению с типичная индексация и трансляция numpy.   -  person Paul    schedule 15.07.2011
comment
@Paul Меня беспокоила скорость, большое спасибо за ответ ниже. Я использовал переменные просто для того, чтобы сделать код более понятным, я также хотел бы избежать использования массива.   -  person Jzl5325    schedule 15.07.2011


Ответы (1)


A[A==NDV]=numpy.nan

A==NDV создаст логический массив, который можно использовать в качестве индекса для A.

person Paul    schedule 15.07.2011
comment
Это специальная последовательность битов за пределами допустимого диапазона для используемого типа данных. Он используется для обозначения отсутствующих данных или результата математической ошибки, которая не привела к правильному значению. Надеюсь, это поможет: en.wikipedia.org/wiki/NaN - person Paul; 22.10.2016
comment
Обратите внимание, что A.min() и A.max() не являются хорошими способами проверить, сработало ли это, так как они оба возвращают nan… Если вы хотите получить минимум/максимум, используйте np.nanmin(A) и np.nanmax(A). - person Skippy le Grand Gourou; 15.07.2020