Как использовать опцию «где» в numpy.multiply? - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно умножить массив (NIR) на скаляр (f), но оставив некоторые значения, которые удовлетворяют определенному условию, без изменений.

Я попробовал следующее:

NIR_f = np.multiply(NIR,f,where=NIR!=-28672.0)

Для проверки я сделал:

i,j=1119,753
NIR[i][j],NIR_f[i][j]

и я получил это:

(-28672.0, 10058.0)

Предполагается, что оба результата должны быть одинаковыми! В этой позиции условие не выполняется, поэтому значение должно оставаться неизменным.

Я неправильно использую опцию "где"?

1 Ответ

0 голосов
/ 02 мая 2018

Без вашего массива или меньшего заменителя я не могу точно воспроизвести вашу проблему. Но есть потенциально 2 проблемы

  • поплавковое тестирование не является точным, поэтому оно может соответствовать одному -28672.0, а не другому.

  • предположение remain intact сложно. leave the value in the output alone, но что это было изначально, значения 0 или NIR.


Использование целочисленного массива для избежания проблемы с плавающей точкой:

In [20]: arr = np.arange(12).reshape(3,4)
In [21]: arr
Out[21]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [22]: np.multiply(arr, 10, where=arr!=10)
Out[22]: 
array([[           0,           10,           20,           30],
       [          40,           50,           60,           70],
       [          80,           90, 481036337249,          110]])
In [24]: np.multiply(arr, 10, where=arr!=10)
Out[24]: 
array([[  0,  10,  20,  30],
       [ 40,  50,  60,  70],
       [ 80,  90,   0, 110]])

arr[2,2] является случайным. Фактически он начинался с массива np.empty правильной формы и типа и заполнял все значения, кроме этого, умножением. Для правильного использования where нам также необходимо указать параметр out.

In [25]: out = np.full(arr.shape,-1)
In [26]: out
Out[26]: 
array([[-1, -1, -1, -1],
       [-1, -1, -1, -1],
       [-1, -1, -1, -1]])
In [27]: np.multiply(arr, 10, where=arr!=10, out=out)
Out[27]: 
array([[  0,  10,  20,  30],
       [ 40,  50,  60,  70],
       [ 80,  90,  -1, 110]])

Проблема неточных чисел возникает достаточно часто, и я не буду пытаться это проиллюстрировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...