2009-11-12 11 views
8

나는 float (항상 0보다 작음)에 값 집합을 가지고 있습니다. 나는 히스토그램으로 bin에 넣기를 원한다. i, e. 히스토그램에서 각 막대 값의 범위를 포함 [0,0.150)Howto bin 시리즈는 플로트 값을 파이썬에서 히스토그램으로 변환합니까?

내가 가진 데이터는 다음과 같습니다 : 내 코드 파크

0.000 
0.005 
0.124 
0.000 
0.004 
0.000 
0.111 
0.112 

내가

[0, 0.005) 5 
[0.005, 0.011) 0 
...etc.. 
과 같은 결과를 얻을 것으로 기대 이하

나는이 광산 코드와 같은 binning을하려고 노력했다. 하지만 작동하지 않는 것 같습니다. 그것을하는 올바른 방법은 무엇입니까?

#! /usr/bin/env python 


import fileinput, math 

log2 = math.log(2) 

def getBin(x): 
    return int(math.log(x+1)/log2) 

diffCounts = [0] * 5 

for line in fileinput.input(): 
    words = line.split() 
    diff = float(words[0]) * 1000; 

    diffCounts[ str(getBin(diff)) ] += 1 

maxdiff = [i for i, c in enumerate(diffCounts) if c > 0][-1] 
print maxdiff 
maxBin = max(maxdiff) 


for i in range(maxBin+1): 
    lo = 2**i - 1 
    hi = 2**(i+1) - 1 
    binStr = '[' + str(lo) + ',' + str(hi) + ')' 
    print binStr + '\t' + '\t'.join(map(str, (diffCounts[i]))) 

~

+0

글쎄, 당신은 [0, 0.005로 정의 범위) (오른쪽 개방)하고있는 경우, "당신은 ... 기대"의 예에서 [0.005, 0.011) (왼쪽 닫힘) 출력은 다음과 같아야합니다. [0, 0.005) 4 [0.005, 0.011] 1 등 ... – Gacek

+0

"작동하지 않는 것 같습니까?" 특정 불만 사항은 무엇입니까? 아니면 모든 사람들이 그것을 실행하고 출력에 대해 마음에 들지 않는 것을 추측하려고해야합니까? –

+0

휠 재발 명을 피하기 위해, 특히 다음 단계가 히스토그램을 플로팅 할 경우 : 모든 것을 처리하는 Matplotlib 프레임 워크 사용을 고려해야합니다. – RedGlyph

답변

13

가능하면 휠을 다시 열지 마십시오. NumPy와 당신이 필요로하는 모든 것을 갖추고 있습니다 :

#!/usr/bin/env python 
import numpy as np 

a = np.fromfile(open('file', 'r'), sep='\n') 
# [ 0.  0.005 0.124 0.  0.004 0.  0.111 0.112] 

# You can set arbitrary bin edges: 
bins = [0, 0.150] 
hist, bin_edges = np.histogram(a, bins=bins) 
# hist: [8] 
# bin_edges: [ 0. 0.15] 

# Or, if bin is an integer, you can set the number of bins: 
bins = 4 
hist, bin_edges = np.histogram(a, bins=bins) 
# hist: [5 0 0 3] 
# bin_edges: [ 0.  0.031 0.062 0.093 0.124] 
+0

그리고 정규화 된 히스토그램을 원할 경우 hist = hist * 1 행을 추가 할 수 있습니다.0/sum (hist) – dval

+0

bin 범위의 적분 값을 1로 지정하려면 ['density = True']를 사용하십시오 (http://docs.scipy.org/doc/numpy-1.10.1/reference/ generated/numpy.histogram.html). – unutbu

2

첫 번째 오류는 다음과 STR이 필요할 때

Traceback (most recent call last): 
    File "C:\foo\foo.py", line 17, in <module> 
    diffCounts[ str(getBin(diff)) ] += 1 
TypeError: list indices must be integers 

왜 당신은 STR에 int를 변환하는? 수정하면 다음과 같이 표시됩니다.

Traceback (most recent call last): 
    File "C:\foo\foo.py", line 17, in <module> 
    diffCounts[ getBin(diff) ] += 1 
IndexError: list index out of range 

5 가지 버킷 만 만들었 기 때문에 문제가 해결되었습니다. 나는 당신의 버킷 팅 방식을 이해하지만의는 50 버킷을하고 무슨 일이 일어 나는지하지 않습니다

6 
Traceback (most recent call last): 
    File "C:\foo\foo.py", line 21, in <module> 
    maxBin = max(maxdiff) 
TypeError: 'int' object is not iterable 

maxdiff는, int 치의 목록 중 하나의 값 그래서 여기에서하고 max 무엇인가? 지금 우리가 얻을, 그것을 제거 충분히

6 
Traceback (most recent call last): 
    File "C:\foo\foo.py", line 28, in <module> 
    print binStr + '\t' + '\t'.join(map(str, (diffCounts[i]))) 
TypeError: argument 2 to map() must support iteration 

물론, 당신이 map 두 번째 인수로 하나의 값을 사용하고 있습니다. 이것에

binStr = '[' + str(lo) + ',' + str(hi) + ')' 
print binStr + '\t' + '\t'.join(map(str, (diffCounts[i]))) 

:

print "[%f, %f)\t%r" % (lo, hi, diffCounts[i]) 

지금은 인쇄 :이에서 마지막 두 줄을 단순화하자

6 
[0.000000, 1.000000) 3 
[1.000000, 3.000000) 0 
[3.000000, 7.000000) 2 
[7.000000, 15.000000) 0 
[15.000000, 31.000000) 0 
[31.000000, 63.000000) 0 
[63.000000, 127.000000) 3 

나는 때문에, 여기에 할 다른 모르겠어요 당신이 사용하고 싶은 버킷을 정말로 이해하지 못합니다. 바이너리 파워가 포함 된 것 같지만 나에게 의미가 없습니다 ...

3
from pylab import * 
data = [] 
inf = open('pulse_data.txt') 
for line in inf: 
    data.append(float(line)) 
inf.close() 
#binning 
B = 50 
minv = min(data) 
maxv = max(data) 
bincounts = [] 
for i in range(B+1): 
    bincounts.append(0) 
for d in data: 
    b = int((d - minv)/(maxv - minv) * B) 
    bincounts[b] += 1 
# plot histogram 

plot(bincounts,'o') 
show()