2013-11-13 3 views
4

У меня есть массив. Я хочу заменить значения > 5 на 1, а значения <= 5 - 0. Я также должен учитывать недопустимые значения (999).Python: как заменить значения в маске в соответствии с условием

1) Мой массив:

>>> import numpy 
>>> a = numpy.array([ [[2, 5, 999],[0, 12, 1]], [[999, 8, 7],[7, 11, 6]] ]) 
>>> a 
array([[[ 2, 5, 999], 
     [ 0, 12, 1]], 

     [[999, 8, 7], 
     [ 7, 11, 6]]]) 

2) Я маскировать недопустимые значения:

>>> mask_a = (a==999) 
>>> a_masked = numpy.ma.masked_array(a, mask = mask_a) 
>>> print a_masked 
[[[2 5 --] 
    [0 12 1]] 

[[-- 8 7] 
    [7 11 6]]] 

3) Я заменяющие значения < = 5 нулями:

>>> a_masked[a_masked<=5]=0 
>>> print a_masked 
[[[0 0 --] 
    [0 12 0]] 

[[-- 8 7] 
    [7 11 6]]] 

4) Я хочу заменить теперь значения> 5 на единицы:

>>> a_masked[a_masked>5]=1 
>>> print a_masked 
[[[0 0 1] 
    [0 1 0]] 

[[1 1 1] 
    [1 1 1]]] 

Почему он не учитывает значения = 999, которые уже были замаскированы ???

Я хочу, чтобы получить следующий результат:

[[[0 0 --] 
     [0 1 0]] 

    [[-- 1 1] 
     [1 1 1]]] 
+0

I спросил точно [тот же вопрос] (http://stackoverflow.com/questions/19957192/substituting-values-in-a-numpy-masked-array) вчера ... – abudis

ответ

6

Как о просто:

>>> a[a != 999] = (a[a != 999] > 5) 
>>> a 
array([[[ 0, 0, 999], 
     [ 0, 1, 0]], 

     [[999, 1, 1], 
     [ 1, 1, 1]]]) 
1
a = np.piecewise(a, [a < 5, numpy.logical_and(a > 5,a <999) ,a >= 999], [0, 1,999]) 

Я думаю, что будет делать то, что вы хотите с одной линии ...

+0

Хотя это более длинная строка, чем та, что в моем ответе, (+1) для указания «np.piecewise». :-) Я не знал, что он существует. – NPE

+0

Спасибо, @ Joran. Но для меня это немного сложно :-) – natalia

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