[英]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.