2015-04-03 2 views
0

Я генерирую серию значений и хотел бы их уложить. Я бы предпочел не использовать numpy или тому подобное. Есть ли что-то более вещий чем:Python - binning

bins = [20,30,40] 
results = [0,0,0,0] 

for _ in range(iterations): 
    x = somefunction() 
    for n, bin in enumerate(bins): 
     if x < bin: 
      results[n] += 1 
      break 
    else: 
     results[-1] += 1 

final = [100 * r/float(iterations) for r in results] 
print(final) 
+0

Вы можете получить лучшие ответы на http://codereview.stackexchange.com/ –

+0

@KevinReid ответы до сих пор кажется разумным, но это может быть стоит попробовать. Я, как правило, думаю о кодосмотре для чего-то более сложного, что этот вопрос. – foosion

ответ

1

Вы могли бы использовать что-то вроде этого:

r = [0] * (len(bins) + 1) 
for _ in xrange(iterations): 
    r[next((i for i, bin in enumerate(bins) if somefunction() < bin), -1)] += 1 

или альтернативно счетчик:

n = len(bins) 
from collections import Counter 
c = Counter() 
c.update(
    next((i for i, bin in enumerate(bins) if somefunction() < bin), n) 
    for _ in xrange(iterations) 
) 
1

Было бы лучше/быстрее (для больших массивов) для использования алгоритма бинарного поиска вместо алгоритма линейного поиска.

То есть,

def binm(rr,ra): 
    ih=len(ra)-1 
    il=0 
    if rr<ra[il]: return il 
    while (ih-il>1): 
    ie=(ih+il)/2 
    if rr<ra[ie]: 
     ih=ie 
    else: 
     il=ie 
    return ih 

bins = [20,30,40] 
results = [0,0,0,0] 

for _ in range(iterations): 
    x = somefunction() 
    ib=binm(x,bins) 
    results[ib]+=1 
+0

Как вы говорите, хорошая идея для больших массивов, но, вероятно, перехитрит для этой ситуации. – foosion