[Numpy-discussion] Sorting of an array row-by-row?

Kirill Balunov kirillbalunov at gmail.com
Fri Oct 20 15:03:37 EDT 2017


Thank you Josef, you gave me an idea, and now the fastest version (for big
arrays) on my laptop is:

np.lexsort(arr[:, ::-1].T)

For me the most strange thing is the order of keys, what was an idea to
keep then right-to-left? How does this relate to lexicographic order*?*

2017-10-20 17:11 GMT+03:00 Joseph Fox-Rabinovitz <jfoxrabinovitz at gmail.com>:

> There are two mistakes in your PS. The immediate error comes from the
> fact that lexsort accepts an iterable of 1D arrays, so when you pass
> in arr as the argument, it is treated as an iterable over the rows,
> each of which is 1D. 1D arrays do not have an axis=1. You actually
> want to iterate over the columns, so np.lexsort(a.T) is the correct
> phrasing of that. No idea about the speed difference.
>
>    -Joe
>
> On Fri, Oct 20, 2017 at 6:00 AM, Kirill Balunov <kirillbalunov at gmail.com>
> wrote:
> > Hi,
> >
> > I was trying to sort an array (N, 3) by rows, and firstly come with this
> > solution:
> >
> > N = 1000000
> > arr = np.random.randint(-100, 100, size=(N, 3))
> > dt = np.dtype([('x', int),('y', int),('z', int)])
> >
> > arr.view(dtype=dt).sort(axis=0)
> >
> > Then I found another way using lexsort function:
> >
> > idx = np.lexsort([arr[:, 2], arr[:, 1], arr[:, 0]])
> > arr = arr[idx]
> >
> > Which is 4 times faster than the previous solution. And now i have
> several
> > questions:
> >
> > Why is the first way so much slower?
> > What is the fastest way in numpy to sort array by rows?
> > Why is the order of keys in lexsort function reversed?
> >
> > The last question  was really the root of the problem for me with the
> > lexsort function.
> > And I still can not understand the idea of such an order (the last is the
> > primary), it seems to me confusing.
> >
> > Thank you!!! With kind regards, Kirill.
> >
> > p.s.: One more thing, when i first try to use lexsort. I catch this
> strange
> > exception:
> >
> > np.lexsort(arr, axis=1)
> >
> > ------------------------------------------------------------
> ---------------
> > AxisError                                 Traceback (most recent call
> last)
> > <ipython-input-278-5162b6ccb8f6> in <module>()
> > ----> 1 np.lexsort(ls, axis=1)
> >
> > AxisError: axis 1 is out of bounds for array of dimension 1
> >
> >
> >
> >
> > _______________________________________________
> > NumPy-Discussion mailing list
> > NumPy-Discussion at python.org
> > https://mail.python.org/mailman/listinfo/numpy-discussion
> >
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at python.org
> https://mail.python.org/mailman/listinfo/numpy-discussion
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20171020/e82a9f8f/attachment.html>


More information about the NumPy-Discussion mailing list