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

Joseph Fox-Rabinovitz jfoxrabinovitz at gmail.com
Fri Oct 20 15:40:30 EDT 2017


I do not think that there is any particular relationship between the
order of the keys and lexicographic order. The key order is just a
convention, which is clearly documented. I agree that it is a bit
counter-intuitive for anyone that has used excel or MATLAB, but it is
ingrained in the API at this point.

    -Joe

On Fri, Oct 20, 2017 at 3:03 PM, Kirill Balunov <kirillbalunov at gmail.com> wrote:
> 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
>
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at python.org
> https://mail.python.org/mailman/listinfo/numpy-discussion
>


More information about the NumPy-Discussion mailing list