2016-11-15 2 views
0

Ich habe einen minimalen Wert und einen maximalen Wert, ich möchte eine Liste von Zahlen zwischen ihnen erzeugen, so dass alle Zahlen gleich zählen. Gibt es eine numpy Funktion oder irgendeine Funktion da draußen?erzeuge Zahlen zwischen min und max mit gleichen Zahlen

Beispiel: GenerateNums (= 1 starten, stoppen = 5, nums = 10)

Erwartete Leistung: [1,1,2,2,3,3,4,4,5,5] dh jede Zahl hat eine fast gleiche Anzahl

+0

Ist 'nums' immer ein Vielfaches von' stop - Starten' + 1 '? – Bathsheba

+0

@Bathsheba nein, nums ist nur die Anzahl der Zahlen, die ich will. In diesem Fall generieren Sie 10 Zahlen von 1 und 5, so dass jede generierte Zahl fast die gleiche Anzahl hat. – Benard

+0

Willkommen zurück zu Stack Overflow. Es sieht so aus, als ob Sie möchten, dass wir etwas Code für Sie schreiben. Es ist üblich, Code in eine Frage einzufügen. Siehe [fragen]. –

Antwort

3

Nimmt "fast gleich" zu Herzen - der Unterschied zwischen den häufigsten und kleinsten gemeinsamen Nummer ist höchstens 1. Keine Garantie, über welche Nummer der Modus ist.

def gen_nums(start, stop, nums): 
    binsize = (1 + stop - start) * 1.0/nums 
    return map(lambda x: int(start + binsize * x), xrange(nums)) 

gen_nums(1, 5, 10) 
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5] 
+0

vielen Dank! das ist, was ich gesucht habe. Leider habe ich es aufgewertet! – Benard

0

Für fast gleiche Anzahl, können Sie aus einer einheitlichen Verteilung probieren. numpy.random.randint tut dies:

>>> import numpy as np 
>>> np.random.randint(low=1, high=6, size=10) 
array([4, 5, 5, 4, 5, 5, 2, 1, 4, 2]) 

Um diese Werte in sortierter Reihenfolge zu erhalten:

>>> sorted(np.random.randint(low=1, high=6, size=10)) 
[1, 1, 1, 2, 3, 3, 3, 3, 5, 5] 

Dieser Prozess wird wie würfeln :) Wie Sie mehr Zeit kosten, die Grafen von jedem Wert sollte sehr ähnlich geworden :

>>> from collections import Counter 
>>> Counter(np.random.randint(low=1, high=6, size=10000)) 
Counter({1: 1978, 2: 1996, 3: 2034, 4: 1982, 5: 2010}) 

Für genau gleich zählt:

>>> range(1,6) * 2 
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5] 
>>> sorted(range(1,6) * 2) 
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5] 
+0

I * denke * das OP will die Ausgabe geordnet. – Bathsheba

0
def GenerateNums(start=1, stop=5, nums=10): 
    result = [] 
    rep = nums/(stop - start + 1) 
    for i in xraneg(start,stop): 
     for j in range(rep): 
      result.append(i) 

    return result 
1

Es gibt eine numpy Funktion:

In [3]: np.arange(1,6).repeat(2) 
Out[3]: array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5]) 
0
def GenerateNums(start=0,stop=0,nums=0,result=[]): 
    assert (nums and stop > 0), "ZeroDivisionError" 
    # get repeating value 
    iter_val = int(round(nums/stop)) 
    # go through strt/end and repeat the item on adding 
    [[result.append(x) for __ in range(iter_val)] for x in range(start,stop)] 
    return result  
print (GenerateNums(start=0, stop=5, nums=30)) 

>>> [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]