1

次の問題があります。Nペアの2D配列があります。例:x = [[5,2]、[10,5]、[3,2]、...](したがって、配列のセットa = [5,10,3、...]およびb = [ 2,5,2、...]最初の列(a)はアイテムの数に対応し、2番目の列(b)は列(a)のアイテムを取得するのにかかる時間です。

アイテムを取得するのにかかった合計時間の累積ヒストグラムをプロットしたいと思います。x軸は配列(a)のビンになり、y軸は(a)の各ビンの配列(b)からの時間の合計である必要があります。つまり、デフォルトの「アイテムの数」-vs-「配列内のインスタンスの数(a)」ではなく、「アイテムの数」-vs-「取得する合計時間(累積)」をプロットしたい

それが理にかなっていることを願っています。

4

3 に答える 3

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 からそのインデックスまでのすべての値の合計です。

于 2010-11-24T18:58:47.527 に答える
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)]  
于 2010-11-24T18:40:15.633 に答える
1

最近、私は matplotlib ( http://matplotlib.sourceforge.net/ )の大ファンになりがちです。実行したいほぼすべてのタイプのプロットに対応する多くの組み込み機能があります。

ヒストグラムを作成する方法の例を次に示します (画像とソース コードが利用可能です)。

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

hist()関数自体のドキュメントは次のとおりです。

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

それが希望どおりでない場合は、ギャラリーを参照して、より適切なプロット タイプを探すことができます。それらはすべて利用可能なソースコードを持っています:

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

うまくいけば、それがあなたが探しているものです。


例を追加します。それで、これはあなたが探しているものの線に沿っていますか?(実際にはヒストグラムではありません):

その場合、それを生成するコードは次のとおりです (xはサンプル入力です)。

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()

そうでない場合は、あきらめて、あなたが何を望んでいるかをまだ完全に理解していないことを認めます. 幸運を!

于 2010-11-24T18:03:58.963 に答える