簡體   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