2016-04-06 12 views
1

マスクされた値の頻度を制限する: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) 

一意の値のブール値Trueの数を最大値2に制限する必要があります。そのため、1は3回ではなく2回だけマスクされます)。結果のマスクは、(関係なく最初の本当の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の値を選択します。

答えて

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) 
+0

申し訳ありませんが、これはサイズ2のメートルに制限されていますか?より大きなサイズのための一般的な方法はありますか? –

+0

実際にmを[1,2]に変更すると、間違った結果につながります。 –

+0

@FabioLamannaうん、それは本当にバグだった。編集内容を確認してください。 – Divakar

関連する問題