Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2011 13:17:49

eiyawii
От:
Зарегистрирован: 2011-08-04
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

свертка

добрый день/вечер.
на питоне надо написать программу свертки, в связи с чем у меня возникли вопросы.
собственно свернуть надо два списка, s=, v=. в википедии описан алгоритм линейной свертки последовательностей http://ru.wikipedia.org/wiki/Свёртка_последовательностей
то есть s=, v= вроде как можно свернуть по этому алгоритму.

не совсем понимаю как *произвести перемножение этих двух последовательностей.* и еще не подскажите алгоритм отражения последовательности, я написал такой код, но он какой-то ненормальный)

j=0
sv=[]
while j<len(sn):
sv+=[0]
j+=1
print sv
i=0
while i<len(sn):
sv[i]=sn[len(sn)-1-i]
i+=1
то есть я создаю список с нулями, а потом каждому элементу в этом списке присваиваю по очереди элементы списка, кот нужно отразить, начиная с конца.

Таким образом возникает вопрос *как написать отражение, перемножение из этого алгоритма с википедии?*



Отредактировано (Окт. 12, 2011 13:22:45)

Офлайн

#2 Окт. 12, 2011 17:54:10

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

свертка

>>> x1 = range(10)
>>> x1
0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x2 = range(10)
>>> x2
1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> out = map(lambda a,b:a*b, x1,x2[::-1])
>>> out
2: [0, 8, 14, 18, 20, 20, 18, 14, 8, 0]



Офлайн

#3 Окт. 12, 2011 20:11:47

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2794
Репутация: +  185  -
Профиль   Отправить e-mail  

свертка

> на питоне надо написать программу свертки

Встроенная функция reduce



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Окт. 12, 2011 21:35:03

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

свертка

import numpy as np
a=np.linspace(0,20,5)
b=np.linspace(0,20,5)
print np.dot(a,b[::-1])
оно и побыстрее будет чем питоновские функции



Офлайн

#5 Окт. 12, 2011 23:58:55

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

свертка

eiyawii
Таким образом возникает вопрос *как написать отражение, перемножение из этого алгоритма с википедии?*
Дополнение нулями до нужной длины n так: lst+*(n-len(lst))
Отражение так: lst
Перемножение так: map(operator.mul, lst1, lst2)



Офлайн

#6 Окт. 13, 2011 00:35:03

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

свертка

Кстати, судя вот по этому: http://www.dsplib.ru/content/conv/conv.html все не так просто, как в википедии описано. или это разные линейные свертки?
Вот, например, приведенный там пример свертки последовательностей и по алгоритму википедии выливается в что-то типа этого:

In [1]: a = [2,1,3,-1]
In [2]: b = [-1,1,2]
In [3]: nout = len(a) + len(b) -1
In [4]: s = map(operator.mul, a + [0]*(nout-len(a)), (b + [0]*(nout-len(b)))[::-1])
In [5]: s
Out[5]: [0, 0, 0, -2, 0, 0]
Что совсем не похоже на их ответ



Офлайн

#7 Окт. 13, 2011 12:20:20

eiyawii
От:
Зарегистрирован: 2011-08-04
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

свертка

2 sp3
не совсем понятно. этот код только для python 2.х подходит? если я пользуюсь функцией range() в idle python 3.2, то выдаёт следующее, соответственно дальше не работает

>>> x1=range(10)
>>> x1
range(0, 10)
2 Rodegast
функция reduce не входит в встроенные функции? если я пытаюсь запросить help(reduce), то интерпретатор говорит что не знает никакого reduce. в какую библиотеку входит эта функция?

doza_and
при выполнении приведенного вами кода возвращается результат 250.0. и если я пытаюсь ввести в idle *import numpy*, то возникает ошибка - нет модуля с таким именем, а если пишу в текстовом редакторе и запускаю, то всё работает, в чем дело?

Ed
спасибо за подсказку про дополнение и отражение, много проще, чем я наворотил)
при перемножении выдаёт ошибку об *operator*, help выдаёт такой синтаксис функции map:
class map(object)
| map(func, *iterables) --> map object
то есть можете пояснить как правильно написать эту функцию?



Офлайн

#8 Окт. 13, 2011 13:27:35

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

свертка

в третьем питоне range создает не список (как в ветке 2.*) а итератор (в 2 это xrange)
чтобы получить список можно сделать так:

x = list(range(10))



Офлайн

#9 Окт. 13, 2011 13:35:05

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

свертка

reduce посмотрите в модуле functools



Офлайн

#10 Окт. 13, 2011 14:04:56

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

свертка

сделайте import operator и прочитайте книжку по языку.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version