[SciPy-User] multidimensional signal.convolve semivalid
josef.pktd at gmail.com
josef.pktd at gmail.com
Thu Jan 7 12:04:59 EST 2010
simplest case I have two signals and I want to apply two linear
filters with convolve. As a result I want to get two signals given by
the convolution of the input signal with each of the filter arrays.
I can either loop over the filter arrays with valid mode which
produces the desired result
signal.convolve(x,a3f[:,:,0], mode='valid')
signal.convolve(x,a3f[:,:,1], mode='valid')
or a can do one 3 dimensional convolution, and throw away two thirds
of the calculation
signal.convolve(x[:,:,None],a3f)[:,1,:]
I didn't manage to get valid or same mode to return the results that I
wanted. Is there a way to do it without loop or redundant
calculations?
background: this will be the fastest way to filter and work with
vector autoregressive processes
example below
Thanks
Josef
>>> x = np.arange(40).reshape((2,20)).T
>>> a3f[:,:,0]
array([[ 0.5, 1. ],
[ 0.5, 1. ]])
>>> a3f[:,:,1]
array([[ 1. , 0.5],
[ 1. , 0.5]])
>>> signal.convolve(x[:,:,None],a3f)[:,1,:]
array([[ 10. , 20. ],
[ 21.5, 41.5],
[ 24.5, 44.5],
[ 27.5, 47.5],
[ 30.5, 50.5],
[ 33.5, 53.5],
[ 36.5, 56.5],
[ 39.5, 59.5],
[ 42.5, 62.5],
[ 45.5, 65.5],
[ 48.5, 68.5],
[ 51.5, 71.5],
[ 54.5, 74.5],
[ 57.5, 77.5],
[ 60.5, 80.5],
[ 63.5, 83.5],
[ 66.5, 86.5],
[ 69.5, 89.5],
[ 72.5, 92.5],
[ 75.5, 95.5],
[ 38.5, 48.5]])
>>> signal.fftconvolve(x[:,:,None],a3f).shape
(21, 3, 2)
>>> signal.fftconvolve(x[:,:,None],a3f)[:,1,:]
array([[ 10. , 20. ],
[ 21.5, 41.5],
[ 24.5, 44.5],
[ 27.5, 47.5],
[ 30.5, 50.5],
[ 33.5, 53.5],
[ 36.5, 56.5],
[ 39.5, 59.5],
[ 42.5, 62.5],
[ 45.5, 65.5],
[ 48.5, 68.5],
[ 51.5, 71.5],
[ 54.5, 74.5],
[ 57.5, 77.5],
[ 60.5, 80.5],
[ 63.5, 83.5],
[ 66.5, 86.5],
[ 69.5, 89.5],
[ 72.5, 92.5],
[ 75.5, 95.5],
[ 38.5, 48.5]])
>>> signal.fftconvolve(x[:,:],a3f[:,:,0]).shape
(21, 3)
>>> signal.fftconvolve(x[:,:],a3f[:,:,0], mode='valid')
array([[ 21.5],
[ 24.5],
[ 27.5],
[ 30.5],
[ 33.5],
[ 36.5],
[ 39.5],
[ 42.5],
[ 45.5],
[ 48.5],
[ 51.5],
[ 54.5],
[ 57.5],
[ 60.5],
[ 63.5],
[ 66.5],
[ 69.5],
[ 72.5],
[ 75.5]])
>>> signal.fftconvolve(x[:,:],a3f[:,:,1], mode='valid')
array([[ 41.5],
[ 44.5],
[ 47.5],
[ 50.5],
[ 53.5],
[ 56.5],
[ 59.5],
[ 62.5],
[ 65.5],
[ 68.5],
[ 71.5],
[ 74.5],
[ 77.5],
[ 80.5],
[ 83.5],
[ 86.5],
[ 89.5],
[ 92.5],
[ 95.5]])
>>>
More information about the SciPy-User
mailing list