如果该值在另一个列表中被屏蔽,则从列表中删除元素

时间:2017-09-14 14:06:41

标签: python list masked-array

我导入的数据格式为numpy蒙版数组的递增整数。掩蔽的元素是不规则的而不是重复的,例如印刷它产生:

masked = [0,1,--,3,--,5,6,--,--,9,--]

我还有另一个递增数字列表,它们不是从零开始,并且有不规则的间隙,与masked的大小不同:

data = [1,3,4,6,7,9,10]

我想删除data的任何元素,如果它的值是masked中的屏蔽元素

所以我得到了:

result = [1,3,6,9]

因为4,7和10是masked中的掩码值。

我认为我的伪代码应该类似于:

for i in len(masked):
    if masked[i] = 'masked' && data[i] == [i]:
        del data[i]

但是我无法协调两个阵列的不同长度和不匹配的索引,

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以使用set函数获取列表集并获取它们的交集。 这是一个演示: -

>>> import numpy as np
>>> import numpy.ma as ma
>>> arr = np.array([x for x in range(11)])
>>> masked = ma.masked_array(arr, mask=[0,0,1,0,1,0,0,1,1,0,1])
>>> masked
masked_array(data = [0 1 -- 3 -- 5 6 -- -- 9 --],
             mask = [False False  True False  True False False  True  True False
  True],
       fill_value = 999999)

>>> data = np.array([1,3,4,6,7,9,10])
>>> result = list(set(data) & set(masked[~masked.mask]))
>>> result
[1, 3, 6, 9]
>>>

答案 1 :(得分:2)

确保data是一个数组:

data = np.asarray(data)

然后:

data[~masked.mask[data]]

这将非常快,但它确实假设您的蒙面数组包含从0到至少max(data)的所有数字。