我有一个包含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)]。
谢谢。
答案 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]])