2013-03-05 3 views
0

Я пытаюсь суммировать значения для фрагмента словаря со значениями класса int.Значения значений словаря

Вот мой код:

from scipy.stats import poisson 

inventories = 4 # states 
mu = 1 # value for lambda 
prob = [] 
for i in range(inventories): 
    prob.append(poisson.pmf(i, mu)) 

Transitions = {} 
for i in range(inventories): 
    for j in range(inventories-1,-1,-1): 
     if i - j < 0: 
      Transitions[0,i,j] = 0 
     elif j <> 0: 
      Transitions[0,i,j] = prob[i-j] 
     elif j == 0: 
      Transitions[0,i,j] = 1 

При запуске этого я пытаюсь получить последнюю строку кода просуммировать все J для каждого I. Я кодер MATLAB, поэтому я привык к матрицам, и я думаю, что это меня завораживает. Буду признателен за любую оказанную помощь.

+3

Поскольку вы уже используете SciPy И вы говорите, что у них больше опыта в Matlab, почему бы не использовать матрицу вместо из словаря? – Junuxx

+0

Спасибо за ответ. Я подумал об этом, и я думаю, что я буду реплицировать проблему как матрицу. Но я действительно хочу изучить Python, и я подумал, что это хороший способ понять словари. – Keith

+0

Возможно, вы знаете, может просветить меня как что было бы лучше, если бы это было значительно увеличено? Спасибо заранее. – Keith

ответ

2

Вы можете нарезать словарь, используя списковых:

>>> l=[v for (k,v) in Transitions.iteritems() if k[1] == 3] 
>>> sum(l) 
1.9196986029286058 

Это дает сумму по J для г = 3. просуммировать I, заменить k[1] с k[2].

Все сказанное, такие списки, как это, довольно быстрые, хотя я не могу сказать, как они относятся к scipy-матрицам.

Вы также можете получить фантазии:

>>> l=[sum([v for (k,v) in Transitions.iteritems() if k[1] == i]) for i in range(1,4,1)] 
>>> l 
[1.3678794411714423, 1.7357588823428847, 1.9196986029286058] 

Это дает вам сумму по каждой строке.


Таким образом, вышеизложенное основано на моем непонимании вопроса. К сожалению, ОП :(

Я думаю, что вы хотите заменить строку с чем-то вроде:

Transitions[0,i,j] = sum([Transitions[0,i,k] for k in range(1,i+1,1)]) 
+1

Здесь будет намного лучше матрица numpy (или даже список списков). Невозможно нарезать dict с помощью этой структуры, не посещая каждый элемент. –

+0

Несомненно, но он ищет, чтобы узнать язык, согласно его комментариям. Предположительно, он/она может решить, что более эффективно/лучше соответствует его потребностям, выполняя некоторые бенчмаркинга. – BenDundee

+0

Спасибо Бен, у этого есть потенциал, но я не могу воспроизвести результат. Где именно вы разместили эту строку кода? Я хочу на самом деле заменить значение «1» в моей последней строке кода суммой по j> 0. – Keith

Смежные вопросы