np.lexsort 在升序和降序之间切换

Fre*_*ter 3 python sorting numpy

我有一个包含列的 numpy 数组x,想要按多列排序(其中一些可能是 类型np.str_。我知道我可以使用np.lexsort.

有没有办法指定每个排序列是否按升序/降序排列?

示例:我知道我可以按如下方式对多个列进行排序:(编辑以指示字符串列!

import numpy as np
arr = np.array([list("aaabbb"),[1,2,3,1,4,3],[1,2,3,4,6,6]]).T # Define arr
idx = np.lexsort([arr[:,1], arr[:,2]]) # sort by column 2 and then by column 1 (i.e. reversed order)
arr = arr[idx]

Run Code Online (Sandbox Code Playgroud)

我还明白我可以按降序排序,如下所示:

arr = arr[idx[::-1]]
Run Code Online (Sandbox Code Playgroud)

这会导致第一个列(第 2 列)按降序排列,后续列按升序排列。

但是我如何指定我希望首先按降序排序(第 2 列),然后按降序排序(第 1 列),以便得到以下结果。

所需输出

array([['b', 4, 6],
       ['b', 3, 6],
       ['b', 1, 4],
       ['a', 3, 3],
       ['a', 2, 2],
       ['a', 1, 1]]
Run Code Online (Sandbox Code Playgroud)

所以基本上对于我的例子来说,我正在寻找相当于:

df = pd.DataFrame(arr, columns=list("abc"))
df.sort_values(by=["c","b"], ascending=[False, False])
Run Code Online (Sandbox Code Playgroud)

一般来说,我希望能够指定(i)要排序的列和(ii)每列的排序顺序(升序/降序)。

U10*_*ard 5

尝试使用减号进行反转,它基本上按每个值的负数排序,这实际上是有效的:

idx = np.lexsort([arr[:,1], -arr[:,2]])
Run Code Online (Sandbox Code Playgroud)

输出:

array([[2, 3, 6],
       [2, 4, 6],
       [2, 1, 4],
       [1, 3, 3],
       [1, 2, 2],
       [1, 1, 1]])
Run Code Online (Sandbox Code Playgroud)

如果有字符串,请尝试:

idx = np.lexsort([arr[:,1], arr[:,2]])
arr = arr[idx]
arr[:, 0] = arr[:, 0][::-1]
Run Code Online (Sandbox Code Playgroud)

输出:

array([['2', '1', '1'],
       ['2', '2', '2'],
       ['2', '3', '3'],
       ['1', '1', '4'],
       ['1', '3', '6'],
       ['1', '4', '6']], 
      dtype='<U11')
Run Code Online (Sandbox Code Playgroud)

编辑:

随着新的编辑:

arr = arr[::-1]
Run Code Online (Sandbox Code Playgroud)

会工作:

array([['b', '4', '6'],
       ['b', '3', '6'],
       ['b', '1', '4'],
       ['a', '3', '3'],
       ['a', '2', '2'],
       ['a', '1', '1']], 
      dtype='<U1')
Run Code Online (Sandbox Code Playgroud)