[Numpy-discussion] lexsort

Travis Oliphant oliphant.travis at ieee.org
Thu Jun 1 18:32:03 CDT 2006

Tom Denniston wrote:
> This function is really useful but it seems to only take tuples not
> ndarrays.   This seems kinda strange.  Does one have to convert the
> ndarray into a tuple to use it?  This seems extremely inefficient.  Is
> there an efficient way to argsort a 2d array based upon multiple
> columns if lexsort is not the correct way to do this?  The only way I
> have found to do this is to construct a list of tuples and sort them
> using python's list sort.  This is inefficient and convoluted so I was
> hoping lexsort would provide a simple solution.

I've just changed lexsort to accept any sequence object as keys.   This 
means that it can now be used to sort a 2d array (of the same data-type) 
based on multiple rows.  The sorting will be so that the last row is 
sorted with any repeats sorted by the second-to-last row and remaining 
repeats sorted by the third-to-last row and so forth...

The return value is an array of indices.   For the 2d example you can use

ind = lexsort(a)
sorted = a[:,ind]   # or a.take(ind,axis=-1)


 >>> a = array([[1,3,2,2,3,3],[4,5,4,6,4,3]])
 >>> ind = lexsort(a)
 >>> sorted = a.take(ind,axis=-1)
 >>> sorted
array([[3, 1, 2, 3, 3, 2],
       [3, 4, 4, 4, 5, 6]])
 >>> a
array([[1, 3, 2, 2, 3, 3],
       [4, 5, 4, 6, 4, 3]])


More information about the Numpy-discussion mailing list