[SciPy-User] 2d convolution
josef.pktd@gmai...
josef.pktd@gmai...
Sat Mar 20 15:52:40 CDT 2010
On Sat, Mar 20, 2010 at 12:07 PM, Nico Schlömer
<nico.schloemer@gmail.com> wrote:
> Thanks for the hint!
>
> I've now set "mode='full'" and extract the data myself by
>
> CR = scipy.signal.fftconvolve( C, R, mode='full' )
> from scipy.signal.signaltools import _centered
> CR = _centered( CR , C.shape )
glad it works,
I forgot to mention earlier:
scipy.stsci.convolve.convolve2d uses numpy.fft.fft2
If it is much faster than the n-dimensional fft convolution, it might
be worth writing a fftconvolve2
Josef
>
> Cheers,
> Nico
>
>
> On Sat, Mar 20, 2010 at 1:49 PM, <josef.pktd@gmail.com> wrote:
>> On Sat, Mar 20, 2010 at 7:51 AM, Nico Schlömer <nico.schloemer@gmail.com> wrote:
>>> Hi,
>>>
>>> I'm trying to compute the the convolution if s 2D array, and I see
>>> that there are several ways in SciPy to do that. As the original data
>>> C and the kernel R are about the same size in my case, I'd profit from
>>> an FFT-based implementation, which I see right now is given by
>>>
>>> scipy.signal.fftconvolve( C, R,
>>> mode='same' )
>>>
>>> and also
>>>
>>> scipy.stsci.convolve.convolve2d( data=C, kernel=R,
>>> mode='constant', cval=0.0,
>>> fft=1 )
>>>
>>> The second method is much faster than the first, and as far as I can
>>> see it would spit out the the same results.
>>>
>>> Now, when the kernel is actually larger than the data, the resulting
>>> array would have the shape of the kernel. Is there any way to restrict
>>> the computations to the size of the data? At first, I thought that was
>>> what "mode='same'"" is for.
>>> I tried cutting the extra data off of the resulting array, but I'm not
>>> quite sure which is the part that I would like to get rid of.
>>>
>>> Any hints here?
>>
>> It's always good to take a look at the source
>>
>> fftconvolve
>>
>> elif mode == "same":
>> if product(s1,axis=0) > product(s2,axis=0):
>> osize = s1
>> else:
>> osize = s2
>> return _centered(ret,osize)
>> elif mode == "valid":
>> return _centered(ret,abs(s2-s1)+1)
>>
>> from scipy.signal.signaltools import _centered
>>
>> and it should be possible to set osize to s1 = array(in1.shape) (C
>> in your notation)
>>
>> scipy.stsci has been removed recently from scipy and will not be in
>> the scipy 0.8 version
>>
>> (I didn't try myself whether it works)
>>
>> Josef
>>
>>>
>>> Cheers,
>>> Nico
>>> _______________________________________________
>>> SciPy-User mailing list
>>> SciPy-User@scipy.org
>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>
>> _______________________________________________
>> SciPy-User mailing list
>> SciPy-User@scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
More information about the SciPy-User
mailing list