Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 限制遮罩值频率的numpy遮罩阵列_Python_Arrays_Numpy - Fatal编程技术网

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)