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

3

我有一个 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”排序。另外,我想在不复制任何内容的情况下进行排序。 编辑: 排序不是按“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), 

...
1个回答

2

您可以给sort方法传递一个order参数:

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)

抱歉,也许我没有表达清楚。排序不是按照“fr”、“to”和“time”,而是先按最小的“fr”和“to”,然后再按“time”。 - imsc
哦,你说得很清楚!我只是看错了!如果@Ophion恢复他们的答案,那就可以了,现在我会发布一个基于他们之前发布的答案的解决方案。 - askewchan

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