2016-01-27 1 views
1

У меня есть 2-й массив, построенный из растрового изображения. Растровое изображение не имеет значения данных, назначенного для -3.4028231e + 38, я пытаюсь заменить это значение на «nan», но я не могу найти это значение, когда я применяю к нему условный оператор.Как заменить значение данных -3.4028231e + 38 на numpy.nan

мои данные следующим образом:

>>> slice22 = inndvi[0:2,0:2] 
>>> slice22 
array([[ -3.40282306e+38, -3.40282306e+38], 
     [ -3.40282306e+38, -3.40282306e+38]], dtype=float32) 

когда я пытаюсь проверить эти значения, если оператор:

>>> if slice22[0][0] ==-3.40282306e+38: 
...  print "yes" 
... else: 
...  print "no" 
... 
no 

выход «нет»

В связи с этим я являюсь не может назначить 3.40282306e + 38 на numpy.nan следующим образом:

slice22[slice22 == 3.40282306e+38] = numpy.nan 

Еще одна вещь, которую я хотел бы упомянуть, заключается в том, что мой набор данных колеблется от +2 до -2 в растре. Я попытался использовать диапазон, чтобы исключить значение 3.40282306e + 38, но все же я получаю ошибки.

>>> slice22 [slice22 < 2 and slice22 >2 ]= np.nan 
Runtime error 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+0

Вы не можете использовать операции равенства чисел с плавающей запятой. – Alik

+2

вы можете использовать 'slice22 [slice22 realli

+0

Пожалуйста, прочитайте http://floating-point-gui.de/ – Alik

ответ

1

Учитывая, что вы знаете, что ваши реальные значения находятся между -2 и 2, вы можете легко отфильтровывать что-либо за пределами этого диапазона.

a[(a < -2) | (a > 2)] = np.nan #option 1 
a[np.abs(a) > 2] = np.nan #option 2 
a[np.logical_or(a < -2, a > 2)] = np.nan #option 3 
+0

спасибо, что вы нашли свое время и решили проблема вариант 1 творит чудеса, еще раз спасибо. –

0

Важно ли для этого иметь равные -3.40282306e + 38 для того, чтобы ваш алгоритм работал? Если и не выполняйте неравенство вместо равных. Equlaity работает с числами с плавающей запятой, если они являются целыми целыми числами, такими как 0, для чисел, подобных youre, используя неравенство, возможно, ответ. Привычка что-то вроде

(-3.40282306e + 38-smallnumber) исправить проблему? -Вы должны установить небольшое количество для Somthing в контексте вашей проблемы, которые я не знаю, что это такое.

Смежные вопросы