Wiederholtes Python-Sampling ohne Ersatz aus einer bestimmten Liste [Duplikat]

Nov 18 2020

Bei einer Liste von (z. B.) Ganzzahlen möchte ich nersatzlose Elemente abtasten, die abgetasteten Elemente aus der ursprünglichen Liste entfernen und diesen Vorgang wiederholen, bis jetzt Elemente in der ursprünglichen Liste erhalten bleiben. Rückgabe einer Liste von round(len(list)/n).

Ich weiß davon random.sample(), aber ich habe keine Implementierung für wiederholte Stichproben ohne Ersatz gefunden. In meinem Pseudocode unten fehlt die Entfernung der abgetasteten Elemente aus der ursprünglichen Liste. Während ich diese Funktion schreibe, frage ich mich jedoch, ob so etwas nicht bereits implementiert ist oder eine elegantere Lösung dafür?

Pseudo-Code

def repeated_sample_without_replacement(my_list, n):
    # where n = number of samples,
    k = int(len(my_list) / n)
    if len(my_list)%n != 0:
        samples = np.repeat(n,k)
        samples = np.append(samples, len(my_list) % n)
    else:
        samples = np.repeat(n,k)
    k = len(my_list) / n
    out = []
    for s in samples:
        out.append(random.sample(my_list, s))
        # remove the now sample elements from my_list
    
    return out

x = repeated_sample_without_replacement(ids,10)
print(x)

Beispieldaten

# Sample Data
ids_clean = [*range(1,40)]
In[71]: # Remove Some ID to Better Represent my Purpose
ids = ids_clean[:12] + ids_clean[13:26] + ids_clean[27:]
ids
Out[73]: 
[1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 14,
 15,
 16,
 17,
 18,
 19,
 20,
 21,
 22,
 23,
 24,
 25,
 26,
 28,
 29,
 30,
 31,
 32,
 33,
 34,
 35,
 36,
 37,
 38,
 39]
len(ids)
Out[74]: 37

Gewünschte Ausgabe

[[1,4,5,6..],[2,8,9,...],[13,15,16,...][27,10,..]]

Antworten

4 superbrain Nov 18 2020 at 00:30

Ihr Code zeigt, dass Sie insgesamt versuchen, die gesamte angegebene Liste abzutasten. Also nur random.shuffleeinmal und dann in Stücke teilen. Oder auch nur Scheiben mit Schritt n, was es einfacher macht:

from random import shuffle

def repeated_sample_without_replacement(my_list, n):
    shuffle(my_list)
    return [my_list[i::n] for i in range(n)]

Demo:

>>> repeated_sample_without_replacement(list(range(10)), 3)
[[7, 5, 0, 1], [2, 6, 8], [4, 3, 9]]

Beachten Sie, dass dies tatsächlich genau nSamples erzeugt . Nicht mehr oder weniger wie deins.

Demo von dir :

>>> repeated_sample_without_replacement(list(range(10)), 3)
[[3, 0, 2], [5, 4, 6], [6, 1, 7], [3]]
>>> repeated_sample_without_replacement(list(range(10)), 13)
[[1, 0, 3, 7, 8, 2, 5, 4, 9, 6]]