On Thu, May 6, 2010 at 11:25 AM, T J <tjhnson@gmail.com> wrote:
Hi,

Is there a way to sort the columns in an array?  I need to sort it so
that I can easily go through and keep only the unique columns.
ndarray.sort(axis=1) doesn't do what I want as it destroys the
relative ordering between the various columns. For example, I would
like:

[[2,1,3],
 [3,5,1],
 [0,3,1]]

to go to:

[[1,2,3],
 [5,3,1],
 [3,0,1]]

(swap the first and second columns).  So I want to treat the columns
as objects and sort them.  I can do this if I convert to a python
list, but I was hoping to avoid doing that because I ultimately need
to do element-wise bitwise operations.


To get the order illustrated:

In [9]: a = array([[2,1,3],[3,5,1],[0,3,1]])

In [10]: i = lexsort([a[::-1][i] for i in range(3)])

In [11]: a[:,i]
Out[11]:
array([[1, 2, 3],
       [5, 3, 1],
       [3, 0, 1]])


But if you just want them sorted, it is easier to do

In [12]: i = lexsort([a[i] for i in range(3)])

In [13]: a[:,i]
Out[13]:
array([[2, 3, 1],
       [3, 1, 5],
       [0, 1, 3]])
 
or just

In [18]: a[:,lexsort(a)]
Out[18]:
array([[2, 3, 1],
       [3, 1, 5],
       [0, 1, 3]])

For the bigger array

In [21]: a
Out[21]:
array([[3, 2, 2, 2, 2],
       [2, 2, 0, 2, 2],
       [0, 1, 1, 0, 1],
       [5, 5, 3, 0, 5]])

In [22]: a[:, lexsort(a)]
Out[22]:
array([[2, 2, 3, 2, 2],
       [2, 0, 2, 2, 2],
       [0, 1, 0, 1, 1],
       [0, 3, 5, 5, 5]])

Chuck