Этот метод использует bisect, который может быть более эффективным, но он требует, чтобы вы сначала отсортировали результаты.
from bisect import bisect
import random
scores = [random.randint(0,100) for _ in xrange(100)]
bins = [20, 40, 60, 80, 100]
scores.sort()
counts = []
last = 0
for range_max in bins:
i = bisect(scores, range_max, last)
counts.append(i - last)
last = i
Я бы не ожидал, что вы установите numpy только для этого, но если вы ужеNumpy вы можете использовать numpy.histogram
.
ОБНОВЛЕНИЕ
Во-первых, использование bisect является более гибким.Использование [i//n for i in scores]
требует, чтобы все лотки были одинакового размера.Использование bisect позволяет бинам иметь произвольные пределы.Также i//n
означает, что диапазоны [вот, привет).При использовании пополам диапазоны (lo, hi), но вы можете использовать bisect_left, если хотите [lo, hi).
Второй пополам быстрее, см. Время ниже.Я заменил Scores.sort () на более медленную сортировку (баллы), потому что сортировка - самый медленный шаг, и я не хотел смещать время с предварительно отсортированным массивом, но ОП говорит, что его / ее массив ужеотсортировано, так что пополам может иметь еще больше смысла в этом случае.
setup="""
from bisect import bisect_left
import random
from collections import Counter
def histogram(iterable, low, high, bins):
step = (high - low) / bins
dist = Counter(((x - low + 0.) // step for x in iterable))
return [dist[b] for b in xrange(bins)]
def histogram_bisect(scores, groups):
scores = sorted(scores)
counts = []
last = 0
for range_max in groups:
i = bisect_left(scores, range_max, last)
counts.append(i - last)
last = i
return counts
def histogram_simple(scores, bin_size):
scores = [i//bin_size for i in scores]
return [scores.count(i) for i in range(max(scores)+1)]
scores = [random.randint(0,100) for _ in xrange(100)]
bins = range(10, 101, 10)
"""
from timeit import repeat
t = repeat('C = histogram(scores, 0, 100, 10)', setup=setup, number=10000)
print min(t)
#.95
t = repeat('C = histogram_bisect(scores, bins)', setup=setup, number=10000)
print min(t)
#.22
t = repeat('histogram_simple(scores, 10)', setup=setup, number=10000)
print min(t)
#.36