37

I have a fairly simple question about how to sort an entire array/recarray by a given column. For example, given the array:

import numpy as np
data = np.array([[5,2], [4,1], [3,6]])

I would like to sort data by the first column to return:

array([[3,6], [4,1], [5,2]])

5 Answers 5

55

Use data[np.argsort(data[:, 0])] where the 0 is the column index on which to sort:

In [27]: import numpy as np

In [28]: data = np.array([[5,2], [4,1], [3,6]])

In [29]: col = 0

In [30]: data=data[np.argsort(data[:,col])]
Out[30]: 
array([[3, 6],
       [4, 1],
       [5, 2]])
Sign up to request clarification or add additional context in comments.

2 Comments

How would you adapt this to sort by more than one column (with one column as higher priority)?
You can use np.lexsort .
14

you are looking for operator.itemgetter

>>> from operator import itemgetter, attrgetter

>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

i.e.

In [7]: a
Out[7]: [[5, 2], [4, 1], [3, 6]]

In [8]: sorted(a, key=operator.itemgetter(0))
Out[8]: [[3, 6], [4, 1], [5, 2]]

Comments

6

This is somewhat tricky:

data[data[:,0].argsort()]

# data[:,n] -- get entire column of index n
# argsort() -- get the indices that would sort it
# data[data[:,n].argsort()] -- get data array sorted by n-th column

I found this recipe here:

Link

http://mathesaurus.sourceforge.net/matlab-numpy.html

Comments

5

To sort on the second column use itemgetter

>>> from operator import itemgetter
>>> data = [[5,2], [4,1], [3,6]]
>>> sorted(data)
[[3, 6], [4, 1], [5, 2]]
>>> sorted(data,key=itemgetter(1))
[[4, 1], [5, 2], [3, 6]]
>>> 

Comments

1

Here's an extension that works with slices:

import numpy as np
x = np.array([[9, 1, 2],
              [5, 3, 4],
              [0, 5, 6]])

Sorting by rows:

x[:, x[1,:].argsort()] # Sort by second row

array([[1, 2, 9]
       [3, 4, 5]
       [5, 6, 0]])

Sorting by columns:

x[x[:,0].argsort(), :] # Sort by first column

array([[0, 5, 6],
       [5, 3, 4],
       [9, 1, 2]])

1 Comment

Could I sort all matrix columns in descending order in similar way using argsort()?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.