2016-08-04 13 views
1

Ich habe eine Reihe von möglichen Werten, zum Beispiel:Python: Teilmenge der Liste so gleichmäßig wie möglich verteilt?

possible_values = range(100) 

Ich habe eine Liste mit unsystematisch (aber eindeutig) Zahlen innerhalb dieses Bereichs, zum Beispiel:

somelist = [0, 5, 10, 15, 20, 33, 77, 99] 

ich erstellen möchten neue Liste der Länge < len (somelist) einschließlich einer Teilmenge dieser Werte, aber möglichst gleichmäßig über den Bereich der möglichen Werte verteilt. Zum Beispiel:

length_newlist = 2 
newlist = some_function(somelist, length_newlist, possible_values) 
print(newlist) 

, die wie

[33, 77] 

Also ideal Ausgabe etwas würde ich weder eine zufällige Stichprobe noch eine Probe mag, die aus gleichem Abstand ganzen Zahlen gewählt. Ich möchte eine Stichprobe basierend auf einer Verteilung (hier eine einheitliche Verteilung) in Bezug auf ein Intervall von möglichen Werten haben. Gibt es eine Funktion oder einen einfachen Weg, dies zu erreichen?

+0

verteilt basierend auf Wert oder vor Ort in der Liste? –

+0

Ich meine in Bezug auf die Bandbreite der möglichen Werte. Wenn mögliche Werte von 0 bis 100 sind, aber die Liste ist verzerrt, zum Beispiel [0,5,10,15,20,33,77,99] und ich sollte zwei Werte wählen, es wäre [33,77] und nicht [10,33] (die gleichmäßig auf die Indizes verteilt wären). Ich habe meine Antwort mit diesem Beispiel bearbeitet, damit es hoffentlich klarer wird was ich meine. –

Antwort

1

Was ist mit den nächsten Werten Ihrer Untergruppe zu den Pivots bestimmter Listen? dh:

def some_function(somelist, length_list, possible_values): 
    a = min(possible_values) 
    b = max(possible_values) 
    chunk_size = (b-a)/(length_list+1) 

    new_list = [] 
    for i in range(1,length_list+1): 
     index = a+i*chunk_size 
     new_list.append(min(somelist, key=lambda x:abs(x-index))) 

    return new_list 

possible_values = range(100) 
somelist = [0, 5, 10, 15, 20, 33, 77, 99] 
length_newlist = 2 
newlist = some_function(somelist, length_newlist, possible_values) 

print(newlist) 

Auf jeden Fall würde ich auch einen Blick auf numpy's random sampling Funktionen zu nehmen empfehlen, das könnte Ihnen auch helfen.

+0

Das ist im Grunde, was ich meinte. Zwei Vorbehalte allerdings (für mich jedenfalls ...): Der obige Code gibt wiederholte Werte zurück (so müssen die ausgewählten Elemente aus der Someliste gelöscht werden) und der Bereich wird überschritten, wenn der nächste Wert über dem Bereich liegt. –

-2

Ich denke, Sie sollten random.sample(population, k) Funktion überprüfen. Er tastet die Population in der k-length-Liste ab.

+0

Das hat wenig mit der Frage zu tun, die nach einer ganz bestimmten Probe fragt. –

+0

Dies scheint nur zufällige Werte auszuwählen. Ich würde eine nicht zufällige Auswahl basierend auf einer einheitlichen Verteilung benötigen. –

+0

Wie können Sie nicht zufällig auf der Verteilung basieren? – Gogetek

1

Angenommen, Ihr Bereich ist 0..N-1, und Sie möchten eine Liste von K < = N-1-Werten. Dann definieren Sie eine "ideale" Liste von K-Werten, die Ihre gewünschte Verteilung über diese vollständige Liste wäre (was ich ehrlich gesagt nicht sicher bin, verstehe ich, was das wäre, aber hoffentlich tun Sie das). Schließlich nehmen Sie die Werte, die am ehesten mit diesen Werten übereinstimmen, aus Ihrer zufällig ausgewählten K-length-Unterliste, um Ihre richtig verteilte K-length-Sublist zu erhalten.

Verwandte Themen