2016-04-06 6 views
4

Ausgehend von einer einfachen Anordnung mit doppelten Werten:numpy feste Menge von Werten unter doppelten Werten wählt in Array

a = np.array([2,3,2,2,3,3,2,1]) 

Ich versuche, von diesem maximal 2 eindeutigen Werten auszuwählen. Das resultierende Array würde wie folgt angezeigt:

b = np.array([2,3,2,3,1]) 

egal in der Reihenfolge der Elemente. Bisher habe ich versucht, mit eindeutigen Werten zu finden:

In [20]: c = np.unique(a,return_counts=True) 

In [21]: c 
Out[21]: (array([1, 2, 3]), array([1, 4, 3])) 

, die nützlich ist, weil es die Häufigkeit der Werte als auch zurück, aber ich bin in Filtern durch Frequenz stucked.

+0

Soll das resultierende Array die ursprüngliche Reihenfolge beibehalten? – Reti43

+0

@ Reti43 egal die Bestellung danke. –

Antwort

3

Sie können eine Liste Verständnis innerhalb np.concatenate() verwenden und die Anzahl der Elemente begrenzen durch Schneiden:

>>> np.concatenate([a[a==i][:2] for i in np.unique(a)]) 
array([1, 2, 2, 3, 3]) 
5

Man könnte np.repeat verwenden, um die gewünschte Anordnung von der Anordnung von uniques und count s zu generieren:

import numpy as np 

a = np.array([2,3,2,2,3,3,2,1]) 
uniques, count = np.unique(a,return_counts=True) 
np.repeat(uniques, np.clip(count, 0, 2)) 

Ausbeuten

array([1, 2, 2, 3, 3]) 

np.clip verwendet wird, um alle Werte in count zu zwingen, zwischen 0 zu sein und 2. Sie erhalten somit maximal zwei Werte für jeden eindeutigen Wert.

3

hier ein Ansatz ist die Reihenfolge, wie sie in dem Eingangsfeld zu halten -

N = 2 # Number of duplicates to keep for each unique element 

sortidx = a.argsort() 
_,id_arr = np.unique(a[sortidx],return_index=True) 

valid_ind = np.unique((id_arr[:,None] + np.arange(N)).ravel().clip(max=a.size-1)) 
out = a[np.sort(sortidx[valid_ind])] 

Probelauf -

In [253]: a 
Out[253]: array([ 0, -3, 0, 2, 0, 3, 2, 0, 2, 3, 3, 2, 1, 5, 0, 2]) 

In [254]: N 
Out[254]: 3 

In [255]: out 
Out[255]: array([ 0, -3, 0, 2, 0, 3, 2, 2, 3, 3, 1, 5]) 

In [256]: np.unique(out,return_counts=True)[1] # Verify the counts to be <= N 
Out[256]: array([1, 3, 1, 3, 3, 1]) 
Verwandte Themen