从数组开始:
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
值。
答案 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)