首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Numpy recarray双向排序

问Python Numpy recarray双向排序
EN

Stack Overflow用户
提问于 2013-04-12 21:23:55
回答 1查看 2.2K关注 0票数 6

我有一个结构化的numpy数组,并按顺序对其进行排序。它工作得很好,但只有一个方向!

降序:

代码语言:javascript
复制
sort(myStructuredArray,order=my_order)[::-1]

和

升序:

代码语言:javascript
复制
sort(myStructuredArray,order=my_order)

order my_order类似于[col1,col2,-col3,col4,-col5,...,colN],对于某些列,我想将其按升序排列,如col1、col2和colN;对于其他列,我想按降序排列col3和col5 (减号)。在本例中,我想先按col1升序排序,然后按col2升序排序,然后按col3降序排序,然后按col4升序排序,然后按col5降序排序,依此类推……我该怎么做呢?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-13 00:11:18

您可以使用numpy.lexsort实现这一点

代码语言:javascript
复制
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'的升序排序

代码语言:javascript
复制
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']作为密钥,但现在对我不起作用。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15972568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档