2011-09-27 1 views
0

나는이 사이트를 읽고있어 내가 원하는 구체적인 대답을 찾지 못하고있다. 반복 및 발전기에 대한 데이비드 비즐리의 슬라이드를 읽으려고했지만 질문이 단순 해 보이지만 답변을 찾을 수 없습니다. 나는 시계 기반의 시뮬레이션 (신경 네트워킹을위한 브라이언)을 실행하고 있는데 출력을 조작하고 그것들을 합계에 더하는 발전기를 가지고있다. (간단한 저역 통과 필터에 n 지수 감쇠가 있기 위해서) . 그런 다음 각 시간 단계에서 이러한 생성기의 출력을 가져 와서 다른 함수에서 사용하여 상태 변수 중 일부를 업데이트하려고합니다. 항목이 생성기 유형이므로이 작업을 수행 할 수 없습니다.어떻게 생성기 yield 문을 다른 함수로 전달합니까? -Python

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 다른 발생기로 출력되어 도시하지만, 매우 유사한 ㄱ하지)

ron= (d/(1-b)) 

을 그러나 이 방법으로 생성자 개체를 사용할 수 없다고 말하지만, print 문을 사용하여 b (및 d)가 모든 timestep (시뮬레이션 실행시)을 원하는 출력을 제공하지만 이러한 출력을 가져 와서 아무것도 수행하지 못하는 것 그들과 함께. (구체적으로 지원되지 않는 피연산자 유형 '-'int 및 generator. 난 float() 숫자로 변환했는데 분명히이 동일한 이유로 작동하지 않습니다, 내 문제가 매우 간단한 솔루션이 있어야하지만 느낄 수 있지만 나는 그것을 찾을 수 없습니다 사전에 감사

+1

1 b'는 b''로 작동하지 않을 수'는 발전기입니다 . 당신은'1-b.next()'또는'value = b.next(); 1 가치'. –

+0

Shift 키를 사용하는 법을 배우십시오. "나"는 자신을 의미합니다. 정확하게 철자를 쓰는 것이 중요합니다. –

+0

@StevenRumbalski 감사합니다 스티븐,이게 내가 정말로 찾고 있던 것입니다. 불행히도 나는 새로운 문제가 생겼다. network_operation 데코레이터를 사용하여이 업데이트 단계를 생성기에 적용하여 시뮬레이션 시간과 일치하는 반환 값을 허용하지 않아야한다. ("None"으로 표시됨) 리턴 할 수있는 방법이있다. 이 값을 얻고 생성기가 시뮬레이션과 동기화되지 않게하려면 최상위 네임 스페이스에 대한 값입니다. 따라서 표기법에서 부모 네임 스페이스까지 '값'을 전달하고 외부 네임 스페이스로 가져갈 수 있습니다. 데코레이터 및 함수의 네임 스페이스? –

답변

2

"더 구체적으로 지원되지 않는 피연산자 유형을 '-'INT 및 발전기".. 힌트를 타고 당신은 사소한에 발전기를 사용할 수 없습니다

. 공식. 당신은 발전기 표현식을 "확대"해야합니다.

ron= (d/(1-b)) 

오른쪽 발전기 b을 가지고 ? b은 "값"이 아닙니다. 어떤 종류의 가치관입니다.

따라서 시퀀스의 각 값을 수식에 적용해야합니다.

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

은 시퀀스의 각 값을 가져 와서 새로운 값을 계산합니다.

(이 실제로 유용 경우 원래 ron= (d/(1-b))b 값의 집합이 훨씬 이해가되지 않습니다 때문에 그것은 분명하지 않다.)

+0

예, 각 시계마다 "적용"을 적용합니다. b.next()를 사용하여 다음 값을 얻고 각 시계 틱에서 ron을 다시 평가하여 원하는대로 x에 대한 for x 메서드를 사용하여 목록으로 평가할 수 없습니다. 다음 클록 틱 전에 시뮬레이션에이 론을 다시 공급해야합니다 (그래서 한번에 모두 평가할 수는 없지만 단계별로 수행해야합니다). 그래도 고마워. –

+0

"그래서 당신이했던 것처럼 x의 b 방법을 사용하여 목록으로 평가할 수 없습니다." 당신은 말할 수 있습니다. 그러나 그것은 말이되지 않습니다. 'b'는 목록입니다. 목록. 'b'를리스트로 취급해야합니다. 'next (b) '를 사용하고 싶다면 ** 당신의 질문을 ** 업데이트 **해야합니다. 당신의 질문은 'b'를리스트로 사용하지 않는'ron = (d/(1-b))'입니다. 나는 너의 질문에 대답하고있다. 이 답변이 마음에 들지 않으면 ** 업데이트 **해야합니다. –

관련 문제