从数组开始:
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/