2010-11-24 7 views
1

다음과 같은 문제점이 있습니다. 나는 N 쌍의 2D 배열을 가지고있다. 예 : x = [[5,2], [10,5], [3,2], ...] (따라서 배열 집합은 a = [5,10,3, ...] 및 b = [2, 2, ...] 첫 번째 열 (a)은 항목 수 두 번째 열 (b)는 (a) 열의 항목을 가져 오는 데 걸리는 시간입니다.2D 배열의 파이썬 누적 히스토그램

항목을 얻는 데 걸린 총 시간의 누적 히스토그램을 그려야합니다. x 축은 array (a)의 bin에 있고 y 축은 각 bin에 대한 array (b)의 시간의 합계 여야합니다. (a) "즉,"항목 수 "를 표시하려고합니다. -vs-"수식의 누적 값 "과 반대로"누적 시간 "을 구합니다. -vs-"배열 (a)의 인스턴스 수 "

나는 그것이 약간 이해 되길 바랍니다.

답변

1

나는 요즘 matplotlib (http://matplotlib.sourceforge.net/)의 큰 팬이되는 경향이 있습니다. 그것은 당신이하고자하는 플로팅의 모든 유형에 대한 내장 된 기능을 많이 가지고 있습니다.

http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.hist

:

여기 http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html

hist() 함수 자체의 문서입니다 : 여기

는 (이미지와 가능한 소스 코드) 히스토그램을 만드는 방법에 대한 예제의 전체 무리입니다

이것이 원하는 것이 아니라면 갤러리를 찾아보고보다 적합한 플롯 유형을 찾을 수 있습니다.

http://matplotlib.sourceforge.net/gallery.html

는 희망이 당신이 찾고있는 무엇 : 그들은 모두 가능한 소스 코드가 있습니다.


예제를 추가하십시오. 이게 당신이 찾고있는 라인에 더 가깝습니까? (정말 이상하지 히스토그램),

from pylab import * 

x = [[5,2],[10,5],[3,2],[5,99],[10,22],[3,15],[4,30]] 
a,b = zip(*x) #Unzip x into a & b as per your example 

#Make a dictionary where the key is the item from a and the value 
#is the sum of all the corresponding entries in b 
sums = {} 
for i in range(0,len(a)): 
    sums[a[i]] = b[i] if not a[i] in sums else sums[a[i]] + b[i] 

#Plot it 
ylabel('Bins') 
xlabel('Total Times') 
barh(sums.keys(),sums.values(),align='center') 
show() 

그렇지 않으면 내가 포기하고 인정합니다 :

그렇다면, 여기에 코드 (x 샘플 입력)를 생성 할 수있어 나는 아직도 너가 원하는 걸 이해하지 못한다. 행운을 빕니다!

내가 만약 당신이 원하는 확실하지 않다
+0

안녕하세요, 답장을 보내 주셔서 감사합니다. Matplotlib.hist()는 배열 (a)의 히스토그램 (배열에 관심이있는 누적 옵션을 허용)을 그리는 방법을 제공합니다. 그것은 (b)의 원소들의 합을 (y)의 bin 범위에 포함시키는 것을 Y 축으로 그리지 못하게합니다. 이것이 내가 문제가되는 것입니다. – Hooloovoo

1

...

x = [[5,2],[10,5],[3,2]] 
a,b=zip(*x) #(5, 10, 3),(2, 5, 2) 
tmp = [] 
for i in range(len(a)): 
    tmp.extend(b[i:i+1]*a[i]) #[2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2] 
def cum(l): 
    c=0 
     for i in range(len(l)): 
      c+=l[i] 
      yield c 
y=list(cum(tmp)) #[2, 4, 6, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 62, 64, 66] 
list(zip(range(1,1+len(y)),y)) #[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10), (6, 15), (7, 20), (8, 25), (9, 30), (10, 35), (11, 40), (12, 45), (13, 50), (14, 55), (15, 60), (16, 62), (17, 64), (18, 66)] 
2

가능성은 이것은 당신이 무엇에 관해 얘기하는지입니까?

>>> pairs = [[5,2],[10,5],[3,2]] 
>>> a, b = zip(*pairs) 
>>> x = list(a) 
>>> y = [reduce(lambda c, d: c+d, b[:i], 0) for i in range(1, len(b)+1)] 
>>> x 
[5, 10, 3] 
>>> y 
[2, 7, 9] 

결과 y 값은 b에서 해당 색인까지의 모든 값의 합계입니다.

+0

thats 내가 뭘 생각하고 있었는지, 좋은 대답 –