Python:如何根据条件替换掩码数组中的值

4

我有一个数组。我想将值> 5替换为1,将值<= 5替换为0。我还必须考虑无效的值(999)。

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的替换为1:

>>> 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]]]

我昨天问了完全相同的问题... - abudis
2个回答

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])

我认为只需要一行代码就可以实现你想要的功能。


尽管这一行比我的答案中的要长,但是因为指出了 np.piecewise 这个函数,所以还是给加上一个 (+1) 好评。我之前不知道它的存在。 - NPE
谢谢你,@Joran。但对我来说似乎有点复杂 :-) - natalia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接