>

저는 초보자 파이썬 사용자입니다. 여러 이웃에 걸쳐 구성 요소를 평균하여 수레 목록을 '평활화'하는 함수를 정의하려고합니다.

내 코드 :

import random
random.seed(1)
def moving_window_average(x, n_neighbors=1):
    width = n_neighbors*2 + 1
    y = list()
    for i in range(n):
        y.append(sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors))
    return y

x=[0,10,5,3,1,5]
avg=moving_window_average(x, 1)
print(avg)

출력에서 ​​나는 '제너레이터'의 목록으로 보이는 것을 얻습니다. 광고가 예상하지 못한 것입니다. 특히 :

[<generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aba0>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992ab48>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992a728>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aa98>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aa40>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992a9e8>]

누군가가 여기서 일어나고있는 일을 알려줄 수 있습니까?

감사합니다


  • 답변 # 1

    문제는 데이터를 "평활화"하기 위해 사용하는 표현식이 잘못 작성되어 생성기 표현식이라고하는 것으로 평가된다는 것입니다. 아래 코드가 올바른 표현 방법이라고 생각합니다.

    import random
    random.seed(1)
    n = 3
    def moving_window_average(x, n_neighbors=1):
        width = n_neighbors*2 + 1
        y = list()
        for i in range(n):
            y.append(sum(x[i+t] for t in range(-n_neighbors,n_neighbors)) / width)
        return y
    
    x=[0,10,5,3,1,5]
    avg=moving_window_average(x, 1)
    print(avg)
    
    

  • 답변 # 2

    제너레이터는 반복 될 때 소모되는 반복 가능한 요소입니다. 이것이 sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors) 문으로 작성하는 것입니다. . 원하는 것이 목록의 목록이면 올바른 설명은 [sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)] 입니다. , 대신 목록 이해입니다. 말하자면 목록의 인라인 생성입니다.

    주제에서 찾은 기사는 여기에서 찾을 수 있습니다. 읽어보십시오.

  • 답변 # 3

    생성자 표현식을 발견했습니다.이 표현식은 이해력이있는 목록 구문에 통합되어 있지만 많은 실수를 일으 킵니다.

    예를 들면 :

    x=[0,10,5,3,1,5]
     (y for y in x) 
    Out[19]: <generator object <genexpr> at 0x000000000C02FEB8>
     [y for y in x]
    Out[20]: [0, 10, 5, 3, 1, 5]
     print(y for y in x)
    <generator object <genexpr> at 0x000000000C02FE60>
     print((y for y in x))
    <generator object <genexpr> at 0x000000000BFA1938>
     print(*(y for y in x))
    0 10 5 3 1 5
     [(y for y in x)]
    Out[24]: [<generator object <genexpr> at 0x000000000BFA1D58>]
     list(y for y in x)
    Out[25]: [0, 10, 5, 3, 1, 5]
    
    

    귀하의 경우 [] 를 추가하여 문제를 해결할 수 있다고 생각합니다.  당신의 표정을 소리 내십시오 :

    y.append([sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)])
    
    

    []  생성기가 값을 평가하도록합니다. Generator는 메모리를 절약하고 실행을 지연시키는 데 사용되는 강력한 개체입니다. 당신의 목표가 아닙니다.

  • 이전 javascript - js에서 모달 열기
  • 다음 c++ - 오류 오류 - ‘void *’는 객체에 대한 포인터 유형이 아닙니다