Hi, group, I am new to numpy. I have 2 questions for array sort. 1. How to sort an array by its one column or one row? I know python buildin sort() can do it for list by passing own cmp function. but array function sort() will sort each column or row seperately,as I know. I don't want to convert array to list to sort and then convert back to array. 2. How to get the rank of a rank0 array? The first "rank" means the order of each element after sorting, instead of the "dimension" meaning in numpy. Just like "rank()" function in splus. Thank you Chunlei
CL WU wrote:
Hi, group, I am new to numpy. I have 2 questions for array sort.
1. How to sort an array by its one column or one row? I know python buildin sort() can do it for list by passing own cmp function. but array function sort() will sort each column or row seperately,as I know. I don't want to convert array to list to sort and then convert back to array.
I think you want argsort plus take. For example, the following sorts on the second column of a: a = array([[4,5,6], [1,2,3], [7,8,9]]) arg = argsort(a[:,1]) take(a, arg, 0)
2. How to get the rank of a rank0 array? The first "rank" means the order of each element after sorting, instead of the "dimension" meaning in numpy. Just like "rank()" function in splus.
If I understand you correctly, you want argsort as mentioned above. Regards, tim
Thank you
Chunlei
 This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Numpydiscussion mailing list Numpydiscussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpydiscussion
Thank you, Tim. argsort() and take() does provide a easy way to sort an array based on any col or row. But for the second question, it doesn't return the result I want. As below, softrank or softrank1 are functions I am currently using for get the rank of a vector(first is more efficient). It returns the index of each value from original array/list in sorted array/list. I hope there is an efficient function in array level to do the same work.
from Numeric import * a=array([5,2,3]) argsort(a) array([1, 2, 0]) def sortrank(list): ... n=len(list) ... li_a=[(i,list[i]) for i in range(n)] ... li_a.sort(lambda a,b:cmp(a[1],b[1])) ... li_b=[(i,li_a[i]) for i in range(n)] ... li_b.sort(lambda a,b:cmp(a[1][0],b[1][0])) ... return [x[0] for x in li_b] ... sortrank(a) [2, 0, 1] def sortrank2(li): ... li_sorted=li[:] ... li_sorted.sort() ... return [li_sorted.index(x) for x in li] sortrank1(list(a)) [2, 0, 1]
Thanks again. Chunlei Tim Hochberg wrote:
CL WU wrote:
Hi, group, I am new to numpy. I have 2 questions for array sort.
1. How to sort an array by its one column or one row? I know python buildin sort() can do it for list by passing own cmp function. but array function sort() will sort each column or row seperately,as I know. I don't want to convert array to list to sort and then convert back to array.
I think you want argsort plus take. For example, the following sorts on the second column of a:
a = array([[4,5,6], [1,2,3], [7,8,9]]) arg = argsort(a[:,1]) take(a, arg, 0)
2. How to get the rank of a rank0 array? The first "rank" means the order of each element after sorting, instead of the "dimension" meaning in numpy. Just like "rank()" function in splus.
If I understand you correctly, you want argsort as mentioned above.
Regards,
tim
Thank you
Chunlei
 This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Numpydiscussion mailing list Numpydiscussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpydiscussion
 This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Numpydiscussion mailing list Numpydiscussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpydiscussion
participants (2)

CL WU

Tim Hochberg