在python中的2D数组中同时屏蔽两行中的值

时间:2017-01-18 16:37:29

标签: python numpy

我有一个包含3列的数据 - x,y和z。我想掩盖某个范围内的x和y的某些值。例如,如果我有一个具有以下值的数据 [xyz] =([0 1 1],[1 1 5],[2 1 2],[3 1 7],[0 2 6],[1 2 7],[2 2 5],[3 2] 5])。

我想掩盖以下两个范围内的值(i)x =(0到3)和y = 1和(ii)x =(2,3)和y = 2。在输出中也应该避免对应于上面掩码的z值。我想使用numpy.ma模块中屏蔽行和列的概念。

我想要输出[(0,2,6),(1,2,7)]。

谢谢。

2 个答案:

答案 0 :(得分:1)

这是它的工作原理;)在这里,我使用列表理解来构建一个新列表。在列表理解中,您可以使用if来过滤结果。

my_array = np.array([[0, 1, 1],[1, 1, 5],[2, 1, 2],[3, 1, 7],[0, 2, 6],[1, 2, 7],[2, 2, 5],[3, 2, 5]])
def condition1(point):
    if point[0] in range(4) and point[1] == 1:
        return False
    return True
def condition2(point):
    if point[0] in range(2,4) and point[1] == 2:
        return False
    return True
result = [point for point in my_array if condition1(point) and condition2(point)]

给你这个结果:

[array([0, 2, 6]), array([1, 2, 7])]

使用result = np.vstack(result)即可获得

array([[0, 2, 6],
       [1, 2, 7]])

更新

如果你想使用numpy.ma,你可以这样做

import numpy as np
import numpy.ma as ma
my_array = np.array([[0, 1, 1],[1, 1, 5],[2, 1, 2],[3, 1, 7],[0, 2, 6],[1, 2, 7],[2, 2, 5],[3, 2, 5]])
condition1 = (my_array[:, 0] >= 0) & (my_array[:, 0] <= 3) & (my_array[:, 1] == 1)
condition2 = (my_array[:, 0] >= 2) & (my_array[:, 0] <= 3) & (my_array[:, 1] == 2)
ma.masked_array(my_array, mask=np.tile((condition1 | condition2), [3, 1]).T)

给你这个结果

masked_array(data =
 [[-- -- --]
 [-- -- --]
 [-- -- --]
 [-- -- --]
 [0 2 6]
 [1 2 7]
 [-- -- --]
 [-- -- --]],
             mask =
 [[ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [False False False]
 [False False False]
 [ True  True  True]
 [ True  True  True]],
       fill_value = 999999)

不过,我更喜欢我的第一个解决方案;)

答案 1 :(得分:0)

使用:

import numpy as np

# your array
r = np.array([[0, 1, 1],[1, 1, 5], [2, 1, 2],[3, 1, 7],
              [0, 2, 6],[1, 2, 7],[2, 2, 5],[3, 2, 5]])

# your limits
max_r = [5,5,5]
min_r = [1,1,1]

filtered_r = r[(np.prod(r>=min_r, 1)  * np.prod(r<=max_r, 1)) == True]

>>>filtered_r
>>>array([[1, 1, 5],
   [2, 1, 2],
   [2, 2, 5],
   [3, 2, 5]])