以不同顺序对多列上的结构化numpy数组进行排序

时间:2018-09-28 13:53:20

标签: python arrays sorting numpy numpy-ndarray

我有一个结构化的numpy数组:

dtype = [('price', float), ('counter', int)]
values = [(35, 1), (36, 2),
          (36, 3)]
a = np.array(values, dtype=dtype)

如果价格相等,我想对价格进行排序,然后对计数器进行排序:

a_sorted = np.sort(a, order=['price', 'counter'])[::-1]

我需要按降序排列价格,当价格相等时,请考虑按升序排列。在上面的示例中,价格和柜台都是降序排列。

我得到的是:

a_sorted: [(36., 3), (36., 2), (35., 1)]

我需要的是:

 a_sorted: [(36., 2), (36., 3), (35., 1)]

1 个答案:

答案 0 :(得分:1)

您可以使用np.lexsort

a_sorted = a[np.lexsort((a['counter'], -a['price']))]

结果:

array([(36.0, 2), (36.0, 3), (35.0, 1)], 
      dtype=[('price', '<f8'), ('counter', '<i4')])

请记住,顺序是相反的,即排序首先由-a['price']执行。否定会照顾“下降”方面。