[Numpy-discussion] Reflect array?

Joseph Fox-Rabinovitz jfoxrabinovitz at gmail.com
Tue Mar 29 14:17:01 EDT 2016


On Tue, Mar 29, 2016 at 2:02 PM, Benjamin Root <ben.v.root at gmail.com> wrote:
> Along those lines, yes, but you have to be careful of even/odd dimension
> lengths. Would be nice if it was some sort of stride trick so that I don't
> have to allocate a new array twice as we do in the concatenation steps.
>
> Cheers!
>
> Ben Root
>
> On Tue, Mar 29, 2016 at 1:58 PM, Joseph Fox-Rabinovitz
> <jfoxrabinovitz at gmail.com> wrote:
>>
>> 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)
>>
>> Are you looking for something like this:
>>
>> zz = np.hypot.outer(y[:len(y)//2], x[:len(x)//2])
>> zz = np.concatenate((zz[:, ::-1], zz), axis=1)
>> zz = np.concatenate((zz, zz[::-1, :]))
>>

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.

>> > assert np.all(z == zz)
>> >
>> > What can be my "some_mirroring_trick()"? I am hoping for something a
>> > little
>> > better than using hstack()/vstack().
>> >
>> > Thanks,
>> > Ben Root
>> >
>> > _______________________________________________
>> > NumPy-Discussion mailing list
>> > NumPy-Discussion at scipy.org
>> > https://mail.scipy.org/mailman/listinfo/numpy-discussion
>> >
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> https://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> https://mail.scipy.org/mailman/listinfo/numpy-discussion
>



More information about the NumPy-Discussion mailing list