Welcome, guest | Sign In | My Account | Store | Cart

I have looked far and wide for code for fast sorting of n dimensional arrays by the first element, for example if I had the array:
ray = [[1,2,3,7,5][10,11,12,13,14]]

I would want it to come out as ray = [[1,2,3,5,7][10,11,12,14,13]]

There are several ways to do this. One is zipped = zip(ray) zipped.sort() ray = zip(zipped)

but this is extremely slow. Numpy has a much faster way to do it, but it wasn't immediately apparent.

if the above were a numpy array you could simply do the following: indexes = numpy.argsort(ray) for n in xrange(len(ray)) ray[n] = ray[n][indexes]

I did a time test of the two methods below.

Python, 17 lines
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17``` ```rows, cols = 3, 100000 A = np.random.randn(rows, cols) B = [list(n) for n in A] start = time() i = np.argsort(A) for n in xrange(len(A)): A[n] = A[n][i] print time() - start start = time() zipped = zip(*B) zipped.sort() B = zip(*zipped) print time() - start ```

The following was printed out

``````0.0469999313354
0.75
``````

So it does the same operation 16x faster.

Odly, changing the rows to 100 reduces the speedup to only 10x (printed values of 0.764999866486 7.8900001049). I was expecting the opposite Created by Garrett on Wed, 14 Mar 2012 (MIT)