# [Numpy-discussion] Reflect array?

Tue Mar 29 14:48:02 EDT 2016

```> >> On Tue, Mar 29, 2016 at 1:46 PM, Benjamin Root <ben.v.root at gmail.com>
> >> wrote:
> >> > Is there a quick-n-easy way to reflect a NxM array that represents a
> >> > quadrant into a 2Nx2M array? Essentially, I am trying to reduce the size
> >> > of
> >> > an expensive calculation by taking advantage of the fact that the first
> >> > part
> >> > of the calculation is just computing gaussian weights, which is radially
> >> > symmetric.
> >> >
> >> > It doesn't seem like np.tile() could support this (yet?). Maybe we could
> >> > allow negative repetitions to mean "reflected"? But I was hoping there
> >> > was
> >> > some existing function or stride trick that could accomplish what I am
> >> > trying.
> >> >
> >> > x = np.linspace(-5, 5, 20)
> >> > y = np.linspace(-5, 5, 24)
> >> > z = np.hypot(x[None, :], y[:, None])
> >> > zz = np.hypot(x[None, :int(len(x)//2)], y[:int(len(y)//2), None])
> >> > zz = some_mirroring_trick(zz)
> >>
>
> You can avoid the allocation with preallocation:
>
> nx = len(x) // 2
> ny = len(y) // 2
> zz = np.zeros((len(y), len(x)))
> zz[:ny,-nx:] = np.hypot.outer(y[:ny], x[:nx])
> zz[:ny, :nx] = zz[:ny,:-nx-1:-1]
> zz[-ny:, :] = zz[ny::-1, :]
>
> if nx * 2 != len(x):
>     zz[:ny, nx] = y[::-1]
>     zz[-ny:, nx] = y
> if ny * 2 != len(y):
>     zz[ny, :nx] = x[::-1]
>     zz[ny, -nx:] = x
>
> All of the steps after the call to `hypot.outer` create views. This is
> untested, so you may need to tweak the indices a little.
>

A couple of months ago I wrote a C-code with ctypes to do this sort of
mirroring trick on an (N,N,N) numpy array of fft weights (where you
can exploit the 48-fold symmetry of using interchangeable axes), which
was pretty useful since I had N^3 >> 1e9 and the weight function was
quite expensive. Obviously the (N,M) case doesn't allow quite so much
optimization but if it could be interesting then PM me.

Best,
Peter

```