Различия между свертками Python и Julia? - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь преобразовать часть кода из Python в Julia, и мне трудно понять разницу между выходными данными из следующих извилин:

Python:

conc = [10,100,1000,5,2000,200,20]
conc_filter = [1,2,3]
sp.ndimage.convolve1d(conc, conc_filter,axis=0,mode='constant')

Вывод: [ 120, 1230, 2305, 5010, 4215, 6420, 640]

Юлия:

conc = [10,100,1000,5,2000,200,20]
conc_filter = [1,2,3]
conv(conc,conc_filter)

Вывод: [10, 120, 1230, 2305, 5010, 4215, 6420, 640, 60]

Кто-нибудь может объяснить, почему длины на выходе отличаются?В попытке воссоздать вывод Python, я попытался придумать логическую формулу, которая связывает размеры ввода / фильтра с диапазоном индекса, необходимого для среза вывода conv и получения того же результата.Однако мне не очень повезло.Есть ли функция Джулия, которая может производить тот же результат?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Какую рутинную программу Python вы используете?Вот что говорит Python:

>>> conc = [10,100,1000,5,2000,200,20]
>>> conc_filter = [1,2,3]

>>> numpy.convolve(conc, conc_filter,axis=0,mode='constant')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: convolve() got an unexpected keyword argument 'axis'

>>> numpy.convolve(conc, conc_filter)
array([  10,  120, 1230, 2305, 5010, 4215, 6420,  640,   60])

Вам может понадобиться заглянуть в документацию к вашему пакету Python и посмотреть, как заставить процедуры типа fft () делать то, что вам нужно.

0 голосов
/ 26 сентября 2018

Для тех, кто заинтересован, я разработал схему заполнения, используемую в «постоянном» режиме, передаваемую в качестве параметра в функцию свертки Python.Трудность в нахождении взаимосвязи между размерами ввода / вывода была связана с тем, как выполняется заполнение слева и справа для фильтров симметричной и несимметричной свертки.

Код Джулии, приведенный ниже, похоже, соответствует Python-эквиваленту для всех протестированных входов / выходов.

conc = [10,100,1000,5,2000,200,20]
conc_filter = [1,2,3]

n=length(conc)
m=length(conc_filter)

padleft=ceil(Int32,m/2)-1
padright=floor(Int32,m/2)

conc =append!(zeros(padleft),conc)
conc = append!(conc,zeros(padright))

out = zeros(n)
for i in 1:n
    for j in 1:m
        out[i] += conc[i+j-1]*conc_filter[m-j+1]
    end
end
out

Результат: [120, 1230, 2305, 5010, 4215, 6420, 640]

0 голосов
/ 20 сентября 2018

Предполагая, что я правильно понимаю ваш вопрос:

Согласно этому ответу на stackexchange, длина вектора примера Джулии верна.

N + M - 1дает длину выходного вектора 9, как показано в ответе Джулии.

Вы уверены, что код Python и / или скопированный вывод верны?

...