Свертка с одномерным гауссовым - PullRequest
0 голосов
/ 01 октября 2018

Я нуб в свертке и использую Python.Я пытаюсь свернуть одномерный массив с одномерным гауссовым, и мой массив равен

B = [0.011,0.022,.032,0.027,0.025,0.033,0.045,0.063,0.09,0.13,0.17,0.21].

FWHM для гауссианы равно 5. Итак, я вычислил сигму как 5/2.385 = ~2.09 Теперь у меня есть 2 варианта:

  1. Генерация гауссовского кернала с использованием стандартного уравнениядля гауссова и использовать np.convolve (массив, гауссовский) уравнение Гаусса, которое я использовал

  2. Использование scipy.ndimage.gaussian_filter1d Поскольку оба являются задачами свертки, теоретически оба должны датьаналогичные выводы.Но это не так.Почему это так?

Я приложил изображение, где я построил массив против другого равного интервала массива

A = [1.0, 3.0, 5.0, 7.0, 9.0, 11.0, 13.0, 15.0, 17.0, 19.0, 21.0, 23.0].

Массив (B), нанесенный на равный интервал массива (A) В принципе, я хочу построить вместе convolved array и non-convolved массив против A.Как мне это сделать?

1 Ответ

0 голосов
/ 01 октября 2018

Почему numpy.convolve и scipy.ndimage.gaussian_filter1d?

Это потому, что две функции обрабатывают ребро по-разному;по крайней мере, настройки по умолчанию.Если вы возьмете простой пик в центре с нулями повсюду, результат на самом деле будет таким же (как вы можете видеть ниже).По умолчанию scipy.ndimage.gaussian_filter1d отражает данные по краям, а numpy.convolve фактически ставит нули для заполнения данных.Таким образом, если в scipy.ndimage.gaussian_filter1d вы выбрали mode='constant' со значением по умолчанию cval=0 и numpy.convolve в mode=same для получения массива аналогичного размера, результаты, как вы можете видеть ниже, одинаковы.

В зависимости от того, что вы хотите сделать со своими данными, вы должны решить, как должны обрабатываться края.

Что касается того, как это построить, я надеюсь, что мой пример кода объясняет это.

import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage.filters import gaussian_filter1d

def gaussian( x , s):
    return 1./np.sqrt( 2. * np.pi * s**2 ) * np.exp( -x**2 / ( 2. * s**2 ) )

myData = np.zeros(25)
myData[ 12 ] = 1
myGaussian = np.fromiter( (gaussian( x , 1 ) for x in range( -3, 4, 1 ) ), np.float )
filterdData = gaussian_filter1d( myData, 1 )

myFilteredData = np.convolve( myData, myGaussian, mode='same' )
fig = plt.figure(1)

ax = fig.add_subplot( 2, 1, 1 )
ax.plot( myData, marker='x', label='peak' )
ax.plot( filterdData, marker='^',label='filter1D smeared peak' )
ax.plot( myGaussian, marker='v',label='test Gaussian' )
ax.plot( myFilteredData, marker='v', linestyle=':' ,label='convolve smeared peak' )
ax.legend( bbox_to_anchor=( 1.05, 1 ), loc=2 )

B = [0.011,0.022,.032,0.027,0.025,0.033,0.045,0.063,0.09,0.13,0.17,0.21]
myGaussian = np.fromiter( ( gaussian( x , 2.09 ) for x in range( -4, 5, 1 ) ), np.float )
bx = fig.add_subplot( 2, 1, 2 )
bx.plot( B, label='data: B' )
bx.plot( gaussian_filter1d( B, 2.09 ), label='filter1d, refl' )
bx.plot( myGaussian, label='test Gaussian' )
bx.plot(  np.convolve( B, myGaussian, mode='same' ), label='Gaussian smear' )
bx.plot( gaussian_filter1d( B, 2.09, mode='constant' ), linestyle=':', label='filter1d, constant')
bx.legend( bbox_to_anchor=(1.05, 1), loc=2 )
plt.tight_layout()
plt.show()

Предоставление следующего изображения:

Several convolve

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