Python кумулятивная гистограмма двумерного массива - PullRequest
1 голос
/ 24 ноября 2010

У меня следующая проблема. У меня есть двумерный массив из N пар. например: x = [[5,2], [10,5], [3,2], ...] (поэтому набор массивов a = [5,10,3, ...] и b = [2,5,2, ...] Первый столбец (а) соответствует количеству предметов. Второй столбец (b) - это время, необходимое для получения элементов в столбце (а).

Я хочу построить кумулятивную гистограмму общего времени, затраченного на получение предметов. Ось x будет в ячейках массива (a), а ось y должна быть суммой времен от массива (b) для каждой ячейки (a). т.е. я хочу построить «Nr элементов» -vs- «Общее время получения (накопительное)», в отличие от «Nr of items» по умолчанию -vs- «Nr экземпляров в массиве (a)»

Надеюсь, в этом есть какой-то смысл.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Есть шанс, что это то, о чем вы говорите?

>>> 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 до этого индекса.

1 голос
/ 24 ноября 2010

Я не уверен, что вы этого хотите ...

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)]  
1 голос
/ 24 ноября 2010

Я склонен быть большим поклонником 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

Надеюсь, это то, что вы ищете.


Добавление примера. Так это больше соответствует тому, что вы ищете? (Больше не гистограмма):

image

Если это так, вот код для его генерации (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()

Если нет, я сдамся и признаюсь, что все еще не совсем понимаю, чего вы хотите. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...