Python 限制遮罩值频率的numpy遮罩阵列
从数组开始:Python 限制遮罩值频率的numpy遮罩阵列,python,arrays,numpy,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) 我需要将唯一值的布尔值Trues的数量限制为最大值2,以便1只被屏蔽两次而不是三次)。然后,结果掩码将出现(无论第一个实数Tru
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
s的数量限制为最大值2,以便1只被屏蔽两次而不是三次)。然后,结果掩码将出现(无论第一个实数True
值的顺序如何):
或
或
理想情况下,这是一种在有限频率值上的“随机”掩蔽。到目前为止,我试图随机选择数组中的原始唯一元素,但实际上掩码选择
True
值,而不管它们的频率如何。对于未排序输入数组的一般情况,这里有一种基于-
样本运行-
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)
对不起,这只限于2号的m吗?对于较大的尺寸有没有通用的方法?实际上,将m改为[1,2]会导致错误的结果。@FabioLamanna是的,这确实是一个错误。请检查编辑。
array([ True, False, True, False, False, False, True, True], dtype=bool)
array([ False, True, True, False, False, False, True, True], dtype=bool)
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)