Ah, fantastic, thanks Per!

I'd still be interested to hear from the core devs as to why this isn't the 
default, both with meshgrid and mgrid...

Juan.

On 9 Mar 2017, 6:29 PM +1100, per.brodtk...@ffi.no, wrote:
> Hi, Juan.
>
> Meshgrid can actually give what you want, but you must use the options: 
> copy=False  and indexing=’ij’.
>
> In [7]: %timeit np.meshgrid(np.arange(512), np.arange(512))
> 1000 loops, best of 3: 1.24 ms per loop
>
> In [8]: %timeit np.meshgrid(np.arange(512), np.arange(512), copy=False)
> 10000 loops, best of 3: 27 µs per loop
>
> In [9]: %timeit np.meshgrid(np.arange(512), np.arange(512), copy=False, 
> indexing='ij')
> 10000 loops, best of 3: 23 µs per loop
>
> Best regards
> Per A. Brodtkorb
>
> From: NumPy-Discussion [mailto:numpy-discussion-boun...@scipy.org] On Behalf 
> Of Juan Nunez-Iglesias
> Sent: 9. mars 2017 04:20
> To: Discussion of Numerical Python
> Subject: Re: [Numpy-discussion] Why do mgrid and meshgrid not return 
> broadcast arrays?
>
> 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.weckes...@gmail.com>, 
> wrote:
>
>
>
> On Wed, Mar 8, 2017 at 9:48 PM, Juan Nunez-Iglesias <jni.s...@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@scipy.org
> > https://mail.scipy.org/mailman/listinfo/numpy-discussion
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> https://mail.scipy.org/mailman/listinfo/numpy-discussion
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> https://mail.scipy.org/mailman/listinfo/numpy-discussion
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
https://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to