[Numpy-discussion] Why do mgrid and meshgrid not return broadcast arrays?

Juan Nunez-Iglesias jni.soma at gmail.com
Wed Mar 8 22:19:37 EST 2017


Hi Warren,

ogrid doesn’t solve my problem. Note that my code returns arrays that would evaluate as equal to the mgrid output. It’s just that they are copied in mgrid into a giant array, instead of broadcast:


In [176]: a0, b0 = np.mgrid[:5, :5]

In [177]: a1, b1 = th.broadcast_mgrid((np.arange(5), np.arange(5)))

In [178]: a0
Out[178]:
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4]])

In [179]: a1
Out[179]:
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4]])

In [180]: a0.strides
Out[180]: (40, 8)

In [181]: a1.strides
Out[181]: (8, 0)



On 9 Mar 2017, 2:05 PM +1100, Warren Weckesser <warren.weckesser at gmail.com>, wrote:
>
>
> > On Wed, Mar 8, 2017 at 9:48 PM, Juan Nunez-Iglesias <jni.soma at gmail.com> wrote:
> > > I was a bit surprised to discover that both meshgrid nor mgrid return fully instantiated arrays, when simple broadcasting (ie with stride=0 for other axes) is functionally identical and happens much, much faster.
> > >
> >
> >
> > Take a look at ogrid: https://docs.scipy.org/doc/numpy/reference/generated/numpy.ogrid.html
> >
> > Warren
> >
> >
> > > I wrote my own function to do this:
> > >
> > >
> > > def broadcast_mgrid(arrays):
> > >     shape = tuple(map(len, arrays))
> > >     ndim = len(shape)
> > >     result = []
> > >     for i, arr in enumerate(arrays, start=1):
> > >         reshaped = np.broadcast_to(arr[[...] + [np.newaxis] * (ndim - i)],
> > >                                    shape)
> > >         result.append(reshaped)
> > >     return result
> > >
> > >
> > > For even a modest-sized 512 x 512 grid, this version is close to 100x faster:
> > >
> > >
> > > In [154]: %timeit th.broadcast_mgrid((np.arange(512), np.arange(512)))
> > > 10000 loops, best of 3: 25.9 µs per loop
> > >
> > > In [156]: %timeit np.meshgrid(np.arange(512), np.arange(512))
> > > 100 loops, best of 3: 2.02 ms per loop
> > >
> > > In [157]: %timeit np.mgrid[:512, :512]
> > > 100 loops, best of 3: 4.84 ms per loop
> > >
> > >
> > > Is there a conscious design decision as to why this isn’t what meshgrid/mgrid do already? Or would a PR be welcome to do this?
> > >
> > > Thanks,
> > >
> > > Juan.
> > >
> > > _______________________________________________
> > > 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20170309/ed840138/attachment.html>


More information about the NumPy-Discussion mailing list