# [AstroPy] Convolution of NumPy arrays of arbitrary dimension

Foad Sojoodi Farimani f.s.farimani at gmail.com
Mon Aug 13 12:10:48 EDT 2018

```Dear Jake,

I don't think scipy.ndimage.correlate is what I'm looking for. the result
is 5*4 while it must be A.shape+B.shape-1=7*5
Here <https://stackoverflow.com/a/51822929/4999991>somebody was able to
modify different existing
functions astropy.convolution.convolve_fft,
astropy.convolution.convolve, scipy.ndimage.filters.convolve,
scipy.ndimage.filters.convolve
using numpy.pad to generate what I'm looking for.
Next step is to automate this step to have something like numpy.convolve
for 1D or scipy.signal.convolve2d for 2D.

Best,
Foad

On Mon, Aug 13, 2018 at 5:30 PM Jacob Vanderplas <jakevdp at cs.washington.edu>
wrote:

> Foad,
> It sounds like you maybe are looking for a correlation rather than a
> convolution?
>
> >>> from scipy.ndimage import correlate
> >>> correlate(A, B)
>
> array([[36, 28, 14,  4,  2],
>        [20, 24, 24, 14,  9],
>        [16, 26, 28, 23, 23],
>        [24, 21, 19, 27, 25]])
>
>
>  Jake VanderPlas
>  Senior Data Science Fellow
>  Director of Open Software
>  University of Washington eScience Institute
>
> On Mon, Aug 13, 2018 at 1:31 AM, Foad Sojoodi Farimani <
> f.s.farimani at gmail.com> wrote:
>
>> Dear Jake,
>>
>> Thanks alot for your reply.
>> I just tried the scipy.ndimage.convolve and it doesn't seem to be what
>> I'm looking for. I use the term convolution as used in the context of the Cauchy
>> product <https://en.wikipedia.org/wiki/Cauchy_product> of multivariate
>> power series (polynomials). for example
>>
>>     from scipy.ndimage import convolve
>>     import numpy as np
>>
>>     D1=np.array([4,5])
>>     D2=np.array([2,3])
>>     A=np.random.randint(10,size=D1)
>>     B=np.random.randint(10,size=D2)
>>
>>     print(A)
>>     print(B)
>>
>> results:
>>
>> [[9 5 2 0 1]
>>  [1 9 8 4 4]
>>  [7 9 2 9 6]
>>  [5 0 8 8 2]]
>> [[4 6 9]
>>  [9 0 8]]
>>
>> I expect the first element of the conve(A,B) to be 36 but
>> the print(convolve(A, B)) results in:
>>
>> [[168 185 185 137  85]
>>  [230 205 237 196 209]
>>  [212 151 233 198 218]
>>  [115 189 152 210 174]]
>>
>> Also the conve(A,B) should be of the shape A.shape+B.shape-1
>> while scipy.ndimage.convolve result is of the A.shape. the conv I'm looking
>> for is commutative as the Cauchy product of two polynomial is.
>>
>> Best,
>> Foad
>>
>>
>>
>> On Sat, Aug 11, 2018 at 10:11 PM Jacob Vanderplas <
>> jakevdp at cs.washington.edu> wrote:
>>
>>> Hi Foad
>>>
>>>
>>>> Thanks a lot for the reply. I have indeed seen scipy.ndimage.convolve
>>>> and have mentioned it in the OP
>>>> <https://stackoverflow.com/questions/51794274/convolution-of-numpy-arrays-of-arbitrary-dimension-for-cauchy-product-of-multiva>.
>>>> but some questions:
>>>>
>>>
>>> I saw that, but you seemed to imply there that it was limited to 1 and 2
>>> dimensions, when it works for arbitrary dimensions.
>>>
>>>
>>>>
>>>>
>>>>    1. although there is nothing about the dimension limit of the
>>>>    ndarrays in its official page
>>>>    <https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.ndimage.filters.convolve.html>,
>>>>    but I haven't seen any examples showing it works with higher dimensions.
>>>>
>>>> I showed an example of a simple four-dimensional convolution in my
>>> original response.
>>>
>>>
>>>>
>>>>    1. what is the difference between astropy.convolve_fft and
>>>>    scipy.signal.convolve? It seems to me they are for function analysis
>>>>    <https://en.wikipedia.org/wiki/Convolution> not array arithmetics.
>>>>
>>>> By design, scipy.signal.convolve and scipy.signal.fftconvolve produce
>>> the same results. The difference is that the latter uses an FFT to compute
>>> the results, which is generally faster than direct convolution for large
>>> inputs. astropy.convolve_fft is similar to scipy.signal.fftconvolve, with a
>>> few differences listed in the documentation
>>> <http://docs.astropy.org/en/stable/api/astropy.convolution.convolve_fft.html>
>>> .
>>>
>>>>
>>>>    1. As I can see the term convolution, even for array arithmetics is
>>>>    used for different purposes. For example there is
>>>>    also scipy.ndimage.filters.convolve which apparently calculates different
>>>>    things. My final goal is to do finite multivariate formal power series
>>>>    multiplication (Cauchy product). I think I have figured the formula out
>>>>    here
>>>>    <https://math.stackexchange.com/questions/2877478/cauchy-product-of-multivariate-formal-power-series>,
>>>>    but I'm not sure if it is correct completely. questions are:
>>>>       1. is my formula correct?
>>>>          - if not what is the correct one?
>>>>          2. if yes has this been done before?
>>>>       - if yes where? does any of the above functions do the job?
>>>>          3. regardless of the correctness of the formula and existence
>>>>       of other implementations, is my implementation correct so far?
>>>>       4. how to finish the final step to populate the ndarray using
>>>>       the conv function?
>>>>
>>>> At a glance, I'm not certain if your formula or implementation is
>>> correct, and I don't have the time to dig-in at the moment.
>>>
>>> Perhaps someone else can help with that part.
>>>
>>> Best of luck,
>>>    Jake
>>>
>>>
>>>> Thanks a gain and looking forwards to hearing back.
>>>>
>>>> Best,
>>>> Foad
>>>>
>>>> On Sat, Aug 11, 2018 at 1:56 AM Adam Ginsburg <
>>>> adam.g.ginsburg at gmail.com> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Fri, Aug 10, 2018 at 5:51 PM, Jacob Vanderplas <
>>>>> jakevdp at cs.washington.edu> wrote:
>>>>>
>>>>>> Hi Foad,
>>>>>> I'm sorry if I'm misunderstanding something, but does
>>>>>> scipy.ndimage.convolve not address your use case? It implements
>>>>>> N-dimensional convolution:
>>>>>>
>>>>>> from scipy.ndimage import convolveimport numpy as np
>>>>>>
>>>>>> x = np.random.rand(10, 10, 10, 10)
>>>>>> w = np.ones((3, 3, 3, 3))
>>>>>>
>>>>>> result = convolve(x, w)
>>>>>>
>>>>>> For completeness, astropy's convolve_fft supports this same operation
>>>>> since it's doing an nd fft under the hood, but the direct convolution
>>>>> (astropy.convolution.convolve) does not, since we had to hard-code the
>>>>> direct convolution operations in each dimension and so far there has been
>>>>> no demand for an n-dimensional convolution with n>3.
>>>>> _______________________________________________
>>>>> AstroPy mailing list
>>>>> AstroPy at python.org
>>>>> https://mail.python.org/mailman/listinfo/astropy
>>>>>
>>>>
>>>> _______________________________________________
>>>> AstroPy mailing list
>>>> AstroPy at python.org
>>>> https://mail.python.org/mailman/listinfo/astropy
>>>>
>>>>
>>> _______________________________________________
>>> AstroPy mailing list
>>> AstroPy at python.org
>>> https://mail.python.org/mailman/listinfo/astropy
>>>
>>
>> _______________________________________________
>> AstroPy mailing list
>> AstroPy at python.org
>> https://mail.python.org/mailman/listinfo/astropy
>>
>>
> _______________________________________________
> AstroPy mailing list
> AstroPy at python.org
> https://mail.python.org/mailman/listinfo/astropy
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/astropy/attachments/20180813/5c0150ab/attachment-0001.html>
```

More information about the AstroPy mailing list