Sorting arrays in NumPy by column Sorting arrays in NumPy by column numpy numpy

Sorting arrays in NumPy by column


To sort by the second column of a:

a[a[:, 1].argsort()]


@steve's answer is actually the most elegant way of doing it.

For the "correct" way see the order keyword argument of numpy.ndarray.sort

However, you'll need to view your array as an array with fields (a structured array).

The "correct" way is quite ugly if you didn't initially define your array with fields...

As a quick example, to sort it and return a copy:

In [1]: import numpy as npIn [2]: a = np.array([[1,2,3],[4,5,6],[0,0,1]])In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int)Out[3]: array([[0, 0, 1],       [1, 2, 3],       [4, 5, 6]])

To sort it in-place:

In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) #<-- returns NoneIn [7]: aOut[7]: array([[0, 0, 1],       [1, 2, 3],       [4, 5, 6]])

@Steve's really is the most elegant way to do it, as far as I know...

The only advantage to this method is that the "order" argument is a list of the fields to order the search by. For example, you can sort by the second column, then the third column, then the first column by supplying order=['f1','f2','f0'].


You can sort on multiple columns as per Steve Tjoa's method by using a stable sort like mergesort and sorting the indices from the least significant to the most significant columns:

a = a[a[:,2].argsort()] # First sort doesn't need to be stable.a = a[a[:,1].argsort(kind='mergesort')]a = a[a[:,0].argsort(kind='mergesort')]

This sorts by column 0, then 1, then 2.