Generowanie równomiernie rozmieszczonych wielokrotności / próbek w zakresie
Określony przypadek problemu
Mam zakres int od 1-100. Chcę wygenerować n całkowitych liczb w tym zakresie, które sąmożliwie równomiernie rozłożone i zawierają pierwszą i ostatnią wartość.
Przykład
<code>start = 1, end = 100, n = 5 Output: [1, 25, 50, 75, 100] start = 1, end = 100, n = 4 Output: [1, 33, 66, 100] start = 1, end = 100, n = 2 Output: [1, 100] </code>
Co mam obecnie
Właściwie mam podejście do pracy, ale czuję, że myślę o tym i brakuje mi czegoś prostszego? Czy jest to najbardziej efektywne podejście, czy można to poprawić?
<code>def steps(start, end, n): n = min(end, max(n, 2) - 1) mult = end / float(n) yield start for scale in xrange(1, n+1): val = int(mult * scale) if val != start: yield val </code>
Zauważ, że zapewniam, że ta funkcja zawsze zwróci co najmniej dolną i górną wartość graniczną zakresu. Więc, wymuszamn >= 2
Tylko dla wyszukiwania, używam tego do próbkowania ramek obrazu z renderowanej sekwencji, w której zazwyczaj chciałbyś mieć pierwszy, środkowy, ostatni. Ale chciałem być w stanie skalować się trochę lepiej, aby obsłużyć naprawdę długie sekwencje obrazów i uzyskać lepszy zasięg.
Rozwiązane: Z wybranej odpowiedzi
Skończyło się na tym, że użyłem tej nieco zmodyfikowanej wersji odpowiedzi @ vartec, aby być generatorem, a także zamknąćn
wartość dla bezpieczeństwa:
<code>def steps(start,end,n): n = min(end, max(n, 2)) step = (end-start)/float(n-1) return (int(round(start+x*step)) for x in xrange(n)) </code>