Я хочу использовать цикл for, чтобы найти частоту чисел внутри диапазона в python. Например: [дублировать]

Если вы используете Spark, вы можете сделать это с помощью wilcards следующим образом:

scala>sc.textFile("path/*/*")

sc - это SparkContext, который, если вы используете искровую оболочку, инициализируется по умолчанию или если вы создаете свой для собственной программы должен быть установлен экземпляр SparkContext.

Будьте осторожны со следующим флагом:

scala> sc.hadoopConfiguration.get ("mapreduce.input.fileinputformat.input.dir.recursive") res6: String = null

Yo должен установить этот флаг в значение true:

sc.hadoopConfiguration.set ("mapreduce.input.fileinputformat.input.dir.recursive", "true")

4
задан Raymond Hettinger 3 March 2012 в 10:14
поделиться

4 ответа

decs = [int(x/10) for x in scores]

отображает оценки от 0-9 -> 0, 10-19 -> 1 и т. д. Затем просто подсчитайте вхождения 0, 1, 2, 3 и т. Д. (Через что-то вроде collections.Counter) и вернитесь к диапазонам оттуда.

4
ответ дан Amber 21 August 2018 в 09:39
поделиться
  • 1
    или [x//10 for x in scores] – Bi Rico 3 March 2012 в 09:50
  • 2
    Технически разница - x//10 будет генерировать результат float, тогда как int(x/10) будет генерировать int. – Amber 3 March 2012 в 09:51
  • 3
    Конечно, @RaymondHettinger - но я ничего не говорил о list.count, поэтому не знаю, почему вы это упомянули. – Amber 3 March 2012 в 11:05
  • 4
    Я. они разные, но я думаю, что // довольно классный, поэтому я поднимаю его в любое время. – Bi Rico 3 March 2012 в 11:21

Этот метод использует 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.

UPDATE

Во-первых, использование bisect является более гибким. Использование [i//n for i in scores] требует, чтобы все ящики имели одинаковый размер. Использование bisect позволяет бункерам иметь произвольные пределы. Также i//n означает, что диапазоны [lo, hi). Используя bisect, диапазоны (lo, hi], но вы можете использовать bisect_left, если вы хотите [lo, hi].

Второй делите пополам быстрее, см. Тайминги ниже. Я заменил scores.sort () на более медленные сортировки (баллы), потому что сортировка - это самый медленный шаг, и я не хотел смещать времена с предварительно отсортированным массивом, но OP говорит, что его / ее массив уже отсортированный таким образом bisect мог бы иметь еще больший смысл в этом случае.

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
2
ответ дан Bi Rico 21 August 2018 в 09:39
поделиться
  • 1
    Я согласен с @amber. Использование bisect здесь является отходами, когда вы можете использовать простое разделение для равномерно разнесенных ящиков. – Raymond Hettinger 3 March 2012 в 10:06
  • 2
    Я думаю, что @RaymondHettinger и я думали о другом использовании bisect, чем то, что вы заработали здесь (а именно, используя bisect, чтобы найти, в какую ячейку попадает отдельный балл, который будет быть отходами ). Для большого количества баллов вы правы, bisect потенциально эффективен. – Amber 3 March 2012 в 22:19

Чтобы сгруппировать данные, разделите их на ширину интервала. Чтобы подсчитать число в каждой группе, рассмотрите использование коллекций . Counter . Вот выработанный пример с документацией и тестом:

from collections import Counter

def histogram(iterable, low, high, bins):
    '''Count elements from the iterable into evenly spaced bins

        >>> scores = [82, 85, 90, 91, 70, 87, 45]
        >>> histogram(scores, 0, 100, 10)
        [0, 0, 0, 0, 1, 0, 0, 1, 3, 2]

    '''
    step = (high - low + 0.0) / bins
    dist = Counter((float(x) - low) // step for x in iterable)
    return [dist[b] for b in range(bins)]

if __name__ == '__main__':
    import doctest
    print doctest.testmod()
6
ответ дан Raymond Hettinger 21 August 2018 в 09:39
поделиться
  • 1
    Похоже, вы проигнорировали все четыре ответа, которые были написаны перед вами. Если это так, то я бы сказал, что, несмотря на то, что ваш ответ может быть лучшим, возможно, не все остальные заслуживают нисходящего голоса, потому что они могут быть полезны в конце концов (даже если ни один из них не лучший). – jcollado 3 March 2012 в 10:45
  • 2
    Спасибо за ваш ответ. Я пытаюсь реализовать ваше решение, и у меня возникают проблемы с математическими операторами. Например, переменные step и dist не работают с строками. Извините, если я звучу как полный noob (это потому, что я есть), но есть ли способ заставить баллы в списке? Я вводил 11,48,13,9,4. Это строка по умолчанию? – user1246457 3 March 2012 в 21:35
  • 3
    Извините за несколько комментариев. Вот то, с чем я работаю: «из коллекции import Counter def gradeDistribution (examScores, low, high, bin): step = (high-int (low) + 0.0) / bins dist = Counter ((x - int (low) ) // шаг для x в examScores) return [dist [b] для b в диапазоне (bins)] examScores = [raw_input («введите количество баллов»)] gradeDistribution (examScores, 0, 100, 10) »Сообщение об ошибке Я получаю: TypeError: неподдерживаемый тип операндов для -: 'str' и 'int' Спасибо за любую информацию, которую любой может предоставить. – user1246457 3 March 2012 в 21:55
  • 4
    @ user1246457 Когда это произойдет, вы должны обновить свой вопрос, вы можете оставить короткий комментарий, если хотите, чтобы кто-то из них был уведомлен об обновлении. Таким образом, вы не достигли предела комментариев, и ваш код может быть доступен для чтения. Когда пользователь вводит баллы, они сохраняются в виде строк. вы должны преобразовать их в float или int перед вызовом функции гистограммы, выполнив что-то вроде [float(i) for i in examScores]. – Bi Rico 3 March 2012 в 22:06
  • 5
    Отредактировал ответ, чтобы включить преобразование float из ввода строки. – Raymond Hettinger 4 March 2012 в 01:58

Если вам хорошо с использованием внешней библиотеки NumPy, вам просто нужно вызвать numpy.histogram():

>>> data = [82, 85, 90, 91, 70, 87, 45]
>>> counts, bins = numpy.histogram(data, bins=10, range=(0, 100))
>>> counts
array([0, 0, 0, 0, 1, 0, 0, 1, 3, 2])
>>> bins
array([   0.,   10.,   20.,   30.,   40.,   50.,   60.,   70.,   80.,
         90.,  100.])
5
ответ дан Sven Marnach 21 August 2018 в 09:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: