从数组开始:

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值,而不管其频率如何。

最佳答案

对于具有未排序输入数组的一般情况,这是一种基于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)

关于python - numpy mask array限制掩码值的频率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36451071/

10-15 23:30