Python Numpy recarray排序双向。

6
我有一个结构化的numpy数组,正在按照一种顺序对它进行排序。 这很好用,但只能单向排序!
降序:
sort(myStructuredArray,order=my_order)[::-1]

并且

升序:

sort(myStructuredArray,order=my_order)

我的订单 my_order 类似于 [col1,col2,-col3,col4,-col5,...,colN],我想对一些列进行升序排序,例如 col1、col2 和 colN,并对另外一些列进行降序排列,例如 col3 和 col5(减号信号)。 在此示例中,我希望首先按照 col1 升序排序,然后按照 col2 升序排序,然后按照 col3 降序排序,然后按照 col4 升序排序,然后按照 col5 降序排序,以此类推... 我该如何做到这一点?
谢谢。

大家好。 谢谢你们,但我已经找到了解决方案!它非常简单! :) 当指定我的信号类型时,如果一个类型是int,我可以指定<i8 descending或>i8 ascending。 - user2209128
1
尝试使用 key= 参数。 - Elmar Peise
@user2209128 你可以回答自己的问题。 - askewchan
还没有,因为我是新用户...我必须等待7个小时。 - user2209128
2
@user2209128 我认为改变字节序(这就是你用 >< 改变的)并不完全等同于反转顺序。对于某些值,它可能表现得类似,但我认为并非所有情况都如此,请仔细测试! - Jaime
为什么它不能工作? - user2209128
1个回答

7
您可以使用numpy.lexsort来完成此操作。
In [1]: import numpy as np
In [2]: a = np.array([(4,0), (1,9), (1,0), (4,9)],
                     dtype=[('x',int),('y',float)])

In [3]: a
Out[3]: 
array([(4, 0.0), (1, 9.0), (1, 0.0), (4, 9.0)], 
      dtype=[('x', '<i8'), ('y', '<f8')])

In [4]: a['x']
Out[4]: array([4, 1, 1, 4])

In [5]: a['y']
Out[5]: array([ 0.,  9.,  0.,  9.])
lexsort函数的参数优先级与np.sort(..., order=...)相反。因此,要首先按照降序排列'x',然后按照升序排列'y'
In [6]: a[np.lexsort((a['y'], -a['x']))]
Out[6]: 
array([(4, 0.0), (4, 9.0), (1, 0.0), (1, 9.0)], 
      dtype=[('x', '<i8'), ('y', '<f8')])

注:

  • 这仅适用于所有值都是数字的情况(因为负数不会导致字符串排序反转)。
  • 我曾见过在键中使用a['x'][::-1]而不是-a['x'],但目前对我无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接