Если вы используете Spark, вы можете сделать это с помощью wilcards следующим образом:
scala>sc.textFile("path/*/*")
sc - это SparkContext, который, если вы используете искровую оболочку, инициализируется по умолчанию или если вы создаете свой для собственной программы должен быть установлен экземпляр SparkContext.
Будьте осторожны со следующим флагом:
scala> sc.hadoopConfiguration.get ("mapreduce.input.fileinputformat.input.dir.recursive") res6: String = null
blockquote>Yo должен установить этот флаг в значение true:
sc.hadoopConfiguration.set ("mapreduce.input.fileinputformat.input.dir.recursive", "true")
blockquote>
decs = [int(x/10) for x in scores]
отображает оценки от 0-9 -> 0, 10-19 -> 1 и т. д. Затем просто подсчитайте вхождения 0, 1, 2, 3 и т. Д. (Через что-то вроде collections.Counter
) и вернитесь к диапазонам оттуда.
Этот метод использует 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
bisect
, чем то, что вы заработали здесь (а именно, используя bisect, чтобы найти, в какую ячейку попадает отдельный балл, который будет i> быть отходами ). Для большого количества баллов вы правы, 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()
[float(i) for i in examScores]
.
– Bi Rico
3 March 2012 в 22:06
Если вам хорошо с использованием внешней библиотеки 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.])
[x//10 for x in scores]
– Bi Rico 3 March 2012 в 09:50x//10
будет генерировать результатfloat
, тогда какint(x/10)
будет генерироватьint
. – Amber 3 March 2012 в 09:51list.count
, поэтому не знаю, почему вы это упомянули. – Amber 3 March 2012 в 11:05//
довольно классный, поэтому я поднимаю его в любое время. – Bi Rico 3 March 2012 в 11:21