
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 build-in 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 rank-0 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.
- How to sort an array by its one column or one row? I know python build-in 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)
- How to get the rank of a rank-0 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 _______________________________________________ Numpy-discussion mailing list Numpy-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpy-discussion

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.
- How to sort an array by its one column or one row? I know python build-in 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)
- How to get the rank of a rank-0 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 _______________________________________________ Numpy-discussion mailing list Numpy-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpy-discussion
This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Numpy-discussion mailing list Numpy-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpy-discussion
participants (2)
-
CL WU
-
Tim Hochberg