Gewichtete Stichprobe in Python

Ich suche nach einer vernünftigen Definition einer Funktion weighted_sample , die nicht nur einen zufälligen Index für eine Liste der angegebenen Gewichte zurückgibt (was wäre so etwas wie

 def weighted_choice(weights, random=random): """ Given a list of weights [w_0, w_1, ..., w_n-1], return an index i in range(n) with probability proportional to w_i. """ rnd = random.random() * sum(weights) for i, w in enumerate(weights): if w<0: raise ValueError("Negative weight encountered.") rnd -= w if rnd < 0: return i raise ValueError("Sum of weights is not positive") 

Um eine kategorische Verteilung mit konstanten Gewichten zu geben), sondern eine zufällige Stichprobe von k von denen, ohne Ersatz , genauso wie random.sample verhält sich im Vergleich zu random.choice .

So wie weighted_choice geschrieben werden kann

 lambda weights: random.choice([val for val, cnt in enumerate(weights) for i in range(cnt)]) 

weighted_sample könnte als geschrieben werden

 lambda weights, k: random.sample([val for val, cnt in enumerate(weights) for i in range(cnt)], k) 

Aber ich möchte eine Lösung, die es nicht erfordert, die Gewichte in eine (möglicherweise riesige) Liste zu enträtseln.

Bearbeiten: Wenn es irgendwelche netten Algorithmen gibt, die mir ein Histogramm / eine Liste von Frequenzen (im selben Format wie die Argumentgewichte) anstelle einer Sequenz von Indizes geben, wäre das auch sehr nützlich.

  • Python - Nach dem Zufallsprinzip Wörter auswählen, die in einem Quiz angezeigt werden sollen
  • Auswählen einer Zufallszahl innerhalb einer Serie (Python)
  • Python-String oder if-Anweisung
  • Wie würde ich einen zufälligen Hexdigit-Code-Generator mit .join und für Loops machen?
  • Wie man ein zufälliges englisches Wort aus einer Liste auswählt
  • Generieren zufällige Wörter
  • Zufällig aus der Liste mit random.randint in python wählen
  • Wählen Sie zufälliges Einzelteil mit Gewicht aus
  • Python, generieren zufällige String von Klammern
  • Lesen Sie eine kleine Stichprobe aus einer großen CSV-Datei in einen Python-Datenrahmen
  • Beste Weg, um eine Liste von Strings in Python zu randomisieren
  • Python ist die beste Programmiersprache der Welt.