Как я могу передать оператор yield генератор другой функции.-Python - PullRequest
0 голосов
/ 27 сентября 2011

Я читал на этом сайте и не могу найти конкретный ответ, который я хочу.Я пытался прочитать слайды Дэвида Бисли об итерации и генераторах, но до сих пор не могу получить ответ, который ищу, хотя вопрос кажется простым.Я запускаю симуляцию на основе часов (Брайан для нейронных сетей), и у меня есть генератор, который манипулирует выходами и добавляет их к промежуточной сумме (для того, чтобы для простого фильтра нижних частот было n экспоненциального затухания),Затем я хочу получить выходные данные этих генераторов на каждом временном шаге, а затем использовать их в другой функции для обновления некоторых переменных состояния, в нем говорится, что, поскольку элемент имеет тип генератора, я не могу этого сделать.код и объяснение кода следующие:

import numpy
our_range=numpy.arange(0*ms,duration+defaultclock.dt,defaultclock.dt)
a=our_range   
c=defaultclock.t   #this is a clock that is part of the program i'm running, it updates every #timestep and runs through the range given above

def sum_tau(neuron):            #this gives a running sum which i want to access (the alphas can be ignored as they are problem specific)
    for c in a:            #had to express it like this (with c and a) or it wouldn't run
        if c ==0:
            x=0
        elif defaultclock.still_running()==False:
            return
        else:
            x = x*(1-alpha) + p(neuron)*alpha
            print x
            yield x


#p(neuron) just takes some of the neurons variables and gives a number

b=sum_tau(DN)     #this is just to specify the neuron we're working on, problem specific

@network_operation
def x():
    b.next()

@network_operation означает, что на каждом такте будет выполняться нижеприведенная функция, поэтому обновляется сумма до ее требуемого значения.Теперь я хочу обновить значение, используемое для симуляции (где d - выходной сигнал в другой генератор, не показанный, но очень похожий на b), набрав:

ron= (d/(1-b))

Однако,он говорит, что я не могу использовать объект генератора таким образом, я использовал операторы print, чтобы определить, что b (и d) дают выходные данные, которые я хочу получить на каждом временном шаге (когда выполняется симуляция), но я не могу, кажется, взять эти выходные данные и сделатьчто-нибудь с ними.(точнее, неподдерживаемый тип операнда '-' для int и generator. Я попытался преобразовать его в число с помощью float (), но, очевидно, это не работает по той же причине, я чувствую, что должно быть очень простое решение моей проблемы, ноКажется, я не могу его найти. Заранее спасибо.

1 Ответ

2 голосов
/ 27 сентября 2011

"более конкретно неподдерживаемый тип операнда" - 'для int и генератора ". Подсказка.

Вы не можете использовать генератор в тривиальной формуле. Вы должны «расширить» его с помощью выражения генератора.

ron= (d/(1-b))

Есть генератор b, верно? b не является «значением». Это какая-то последовательность значений.

Итак, вы должны применить каждое значение в последовательности к вашей формуле.

ron = [ d/(1-x) for x in b ]

получит каждое значение последовательности и вычислит новое значение.

(Непонятно, действительно ли это полезно, поскольку исходный ron= (d/(1-b)), когда b представляет собой набор значений, не имеет особого смысла.)

...