繁体   English   中英

在numpy中对记录数组进行排序

[英]Sorting a record array in numpy

我有一个numpy结构数组

import numpy as np
np.array([(0, 1, 1167606000), (0, 1, 1167606005), (0, 1, 1167606008),
       (0, 10, 1167606010), (0, 10, 1167606012), (1, 0, 1167606000),
       (1, 2, 1167606001), (1, 0, 1167606005), (1, 0, 1167606008),
       (2, 1, 1167606001), (2, 3, 1167606002), (3, 2, 1167606002),
       (3, 4, 1167606003), (4, 3, 1167606003), (4, 5, 1167606004),
       (5, 4, 1167606004), (5, 6, 1167606005), (6, 5, 1167606005),
       (6, 7, 1167606006), (7, 6, 1167606006), (7, 8, 1167606007),
       (8, 7, 1167606007), (8, 9, 1167606008), (9, 8, 1167606008),
       (9, 10, 1167606009), (10, 9, 1167606009), (10, 0, 1167606010),
       (10, 0, 1167606012)], 
      dtype=[('fr', '<i8'), ('to', '<i8'), ('time', '<i8')])

是否有一种矢量化方式,首先按“fr”,“to”和“time”的最小值对其进行排序。 另一件事是我想要在不制作任何副本的情况下对其进行sort

编辑:排序不是'fr','to'和'time',而是首先是'fr'和'to'的最小值,然后是'time'。 上述案例的预期答案是

(0, 1, 1167606000),
(1, 0, 1167606000),
(0, 1, 1167606005),
(1, 0, 1167606005), 
(0, 1, 1167606008),
(1, 0, 1167606008),
(0, 10, 1167606010), 
(0, 10, 1167606012), 
(1, 2, 1167606001), 
(2, 1, 1167606001), 
(2, 3, 1167606002), 
(3, 2, 1167606002),
(3, 4, 1167606003), 
(4, 3, 1167606003), 

...

您可以给order参数进行sort

a.sort(order=['fr', 'to', 'time'])

按最少两列排序:

使用lexsort ,您可以按任意键排序。 给它a['time']np.minimum(a['to'], a['fr']) (按最后一项排序)

inds = np.lexsort((a['time'], np.minimum(a['to'], a['fr'])))
a = a[inds]

为了避免在重新排列时复制a ,你可以使用take而不是a = a[inds]

np.take(a, inds, out=a)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM