Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python (Numpy) array sorting

I've got this array, named v, of dtype('float64'):

array([[  9.33350000e+05,   8.75886500e+06,   3.45765000e+02],
       [  4.33350000e+05,   8.75886500e+06,   6.19200000e+00],
       [  1.33360000e+05,   8.75886500e+06,   6.76650000e+02]])

... which I've acquired from a file by using the np.loadtxt command. I would like to sort it after the values of the first column, without mixing up the structure that keeps the numbers listed on the same line together. Using v.sort(axis=0) gives me:

array([[  1.33360000e+05,   8.75886500e+06,   6.19200000e+00],
       [  4.33350000e+05,   8.75886500e+06,   3.45765000e+02],
       [  9.33350000e+05,   8.75886500e+06,   6.76650000e+02]])

... i.e. places the smallest number of the third column in the first line, etc. I would rather want something like this...

array([[  1.33360000e+05,   8.75886500e+06,   6.76650000e+02],
       [  4.33350000e+05,   8.75886500e+06,   6.19200000e+00],
       [  9.33350000e+05,   8.75886500e+06,   3.45765000e+02]])

... where the elements of each line hasn't been moved relatively to each other.

like image 601
awoxho Avatar asked Feb 18 '11 22:02

awoxho


1 Answers

Try

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

(with v being the array). v[:,0] is the first column, and .argsort() returns the indices that would sort the first column. You then apply this ordering to the whole array using advanced indexing. Note that you get a sorte copy of the array.

The only way I know of to sort the array in place is to use a record dtype:

v.dtype = [("x", float), ("y", float), ("z", float)]
v.shape = v.size
v.sort(order="x")
like image 197
Sven Marnach Avatar answered Sep 30 '22 02:09

Sven Marnach