为了账号安全,请及时绑定邮箱和手机立即绑定

按列对 2d numpy 字符串/浮点数组进行排序

按列对 2d numpy 字符串/浮点数组进行排序

慕容3067478 2023-07-18 17:35:29
我有以下 numpy 数组(自 1957 年以来该国的火箭发射次数),我想按发射次数的升序对其进行排序。   ['Australia', 6.0],   ['Brazil', 3.0],   ['China', 269.0],   ['France', 303.0],   ['India', 76.0],   ['Iran', 14.0],   ['Israel', 11.0],   ['Japan', 126.0],   ['Kazakhstan', 701.0],   ['Kenya', 9.0],   ['New Zealand', 13.0],   ['North Korea', 5.0],   ['Pacific Ocean', 36.0],   ['Russian Federation', 1398.0],   ['South Korea', 3.0],   ['USA', 1351.0]问题是, np.sort(a, axis = 0) 只对值进行排序,但国家之间没有联系,因此 ei 朝鲜发射了 269 枚火箭(可能比 5 枚更有可能)或者,如果我执行 np.sort(a, axis = 1) 那么我会收到一条错误消息类型错误:“float”和“str”实例之间不支持“<”任何想法将不胜感激!
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

import numpy as np


data = [

   ['Australia', 6.0], 

   ['Brazil', 3.0],

   ['China', 269.0],

   ['France', 303.0],

   ['India', 76.0],

   ['Iran', 14.0],

   ['Israel', 11.0],

   ['Japan', 126.0],

   ['Kazakhstan', 701.0],

   ['Kenya', 9.0],

   ['New Zealand', 13.0],

   ['North Korea', 5.0],

   ['Pacific Ocean', 36.0],

   ['Russian Federation', 1398.0],

   ['South Korea', 3.0],

   ['USA', 1351.0]

]

我们可以创建一个结构化数组,然后按键对其进行排序:


dtype = [

    ('name', '<U18'),    

    ('rockets', float)

]


data = np.array([tuple(x) for x in data], dtype=dtype) 

sorted_data = np.sort(data, order=['rockets'])          


print(sorted_data)


查看完整回答
反对 回复 2023-07-18
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

使用 python 列表排序很容易:


In [208]: alist = [   ['Australia', 6.0],

     ...:    ['Brazil', 3.0],

     ...:    ['China', 269.0],

     ...:    ['France', 303.0],

     ...:    ['India', 76.0],

     ...:    ['Iran', 14.0],

     ...:    ['Israel', 11.0],

     ...:    ['Japan', 126.0],

     ...:    ['Kazakhstan', 701.0],

     ...:    ['Kenya', 9.0],

     ...:    ['New Zealand', 13.0],

     ...:    ['North Korea', 5.0],

     ...:    ['Pacific Ocean', 36.0],

     ...:    ['Russian Federation', 1398.0],

     ...:    ['South Korea', 3.0],

     ...:    ['USA', 1351.0]]

In [209]: newlist = sorted(alist, key=lambda x: x[1])

In [210]: newlist

Out[210]: 

[['Brazil', 3.0],

 ['South Korea', 3.0],

 ['North Korea', 5.0],

 ['Australia', 6.0],

 ['Kenya', 9.0],

 ['Israel', 11.0],

 ['New Zealand', 13.0],

 ['Iran', 14.0],

 ['Pacific Ocean', 36.0],

 ['India', 76.0],

 ['Japan', 126.0],

 ['China', 269.0],

 ['France', 303.0],

 ['Kazakhstan', 701.0],

 ['USA', 1351.0],

 ['Russian Federation', 1398.0]]

使用对象 dtype 数组(保留字符串和浮点列):


In [211]: arr = np.array(alist, object)

In [212]: arr

Out[212]: 

array([['Australia', 6.0],

       ['Brazil', 3.0],

       ['China', 269.0],

       ['France', 303.0],

       ...

       ['USA', 1351.0]], dtype=object)

只需查看第二列即可获取排序索引:


In [213]: idx = np.argsort(arr[:,1])

In [214]: idx

Out[214]: array([ 1, 14, 11,  0,  9,  6, 10,  5, 12,  4,  7,  2,  3,  8, 15, 13])

In [215]: arr[idx]

Out[215]: 

array([['Brazil', 3.0],

       ['South Korea', 3.0],

       ['North Korea', 5.0],

       ['Australia', 6.0],

       ['Kenya', 9.0],

       ...

       ['Russian Federation', 1398.0]], dtype=object)

其他答案中的结构化数组方法也很好。


查看完整回答
反对 回复 2023-07-18
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信