Почему это возвращает список генераторов? - PullRequest
0 голосов
/ 03 декабря 2018

Я начинающий пользователь Python.Я пытаюсь определить функцию для «сглаживания» списка с плавающей точкой путем усреднения компонентов по ряду соседей.

Вот мой код:

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>]

Может ли кто-нибудь указать мне на то, что здесь происходит?

Большое вам спасибо

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Проблема в том, что выражение, которое вы используете для «сглаживания» данных, записано неправильно - поэтому оно оценивается как нечто, называемое выражением генератора .Я думаю, что код ниже является правильным способом выразить это:

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)
0 голосов
/ 03 декабря 2018

вы столкнулись с генераторными выражениями , которые интегрированы в синтаксис списка понимания, но вызывают многократную ошибку.

, например:

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]

В вашем случаеЯ думаю, что вы можете исправить вашу проблему, добавив [] aroud вашего выражения:

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

[] заставит генератор оценивать значения.Генератор - это мощный объект, используемый для экономии памяти и задержки выполнения.не ваша цель здесь.

0 голосов
/ 03 декабря 2018

Генератор - это итерация, которая исчерпывается при повторении.Это то, что вы создаете с помощью оператора 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)], что вместо этого является списком.Встроенное создание списка, так сказать.

Статья, которую я нашел по этой теме, может быть найдена здесь .Прочитайте.

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