numpy mask数组限制屏蔽值的频率

时间:2016-04-06 12:23:35

标签: python arrays numpy

从数组开始:

a = np.array([1,1,1,2,3,4,5,5])

和过滤器:

m = np.array([1,5])

我现在正在构建一个掩码:

b = np.in1d(a,m)

正确返回:

array([ True,  True,  True, False, False, False,  True,  True], dtype=bool)

我需要将唯一值的布尔值True的数量限制为最大值2,这样1只被屏蔽两次而不是三次。然后会出现结果掩码(无论第一个真实True值的顺序):

array([ True,  True,  False, False, False, False,  True,  True], dtype=bool)

array([ True,  False,  True, False, False, False,  True,  True], dtype=bool)

array([ False,  True,  True, False, False, False,  True,  True], dtype=bool)

理想情况下,这是一种"随机"掩盖有限频率的值。到目前为止,我尝试随机选择数组中的原始唯一元素,但实际上,无论频率如何,掩码都会选择True值。

1 个答案:

答案 0 :(得分:1)

对于未排序输入数组的一般情况,这里有一种基于np.searchsorted的方法 -

N = 2 # Parameter to decide how many duplicates are allowed

sortidx = a.argsort()
idx = np.searchsorted(a,m,sorter=sortidx)[:,None] + np.arange(N)
lim_counts = (a[:,None] == m).sum(0).clip(max=N)
idx_clipped = idx[lim_counts[:,None] > np.arange(N)]
out = np.in1d(np.arange(a.size),idx_clipped)[sortidx.argsort()]

示例运行 -

In [37]: a
Out[37]: array([5, 1, 4, 2, 1, 3, 5, 1])

In [38]: m
Out[38]: [1, 2, 5]

In [39]: N
Out[39]: 2

In [40]: out
Out[40]: array([ True, True, False, True, True, False, True, False], dtype=bool)