[Numpy-discussion] lexsort (original) (raw)
Tom Denniston tom.denniston at alum.dartmouth.org
Thu Jun 1 20:50:30 EDT 2006
- Previous message (by thread): [Numpy-discussion] lexsort
- Next message (by thread): [Numpy-discussion] lexsort
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
This is great! Many thanks Travis. I can't wait for the next release!
--Tom
On 6/1/06, Travis Oliphant <oliphant.travis at ieee.org> wrote:
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)
Example: >>> 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]])
-Travis
- Previous message (by thread): [Numpy-discussion] lexsort
- Next message (by thread): [Numpy-discussion] lexsort
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]