gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:47:27 24 4
gpt4 key购买 nike

我有一个带有 x 列的 numpy 数组,我想按多列排序(其中一些可能是 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]

我也明白了,我可以按降序排列如下:

arr = arr[idx[::-1]]

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

但我如何指定我想要先排序(第 2 列)降序,然后再排序(第 1 列)降序,以便我得到以下结果。

期望的输出:

array([['b', 4, 6],
['b', 3, 6],
['b', 1, 4],
['a', 3, 3],
['a', 2, 2],
['a', 1, 1]]

所以基本上对于我的示例,我正在寻找等同于:

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

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

最佳答案

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

idx = np.lexsort([arr[:,1], -arr[:,2]])

输出:

array([[2, 3, 6],
[2, 4, 6],
[2, 1, 4],
[1, 3, 3],
[1, 2, 2],
[1, 1, 1]])

如果有字符串,试试:

idx = np.lexsort([arr[:,1], arr[:,2]])
arr = arr[idx]
arr[:, 0] = arr[:, 0][::-1]

输出:

array([['2', '1', '1'],
['2', '2', '2'],
['2', '3', '3'],
['1', '1', '4'],
['1', '3', '6'],
['1', '4', '6']],
dtype='<U11')

编辑:

有了新的编辑:

arr = arr[::-1]

会起作用:

array([['b', '4', '6'],
['b', '3', '6'],
['b', '1', '4'],
['a', '3', '3'],
['a', '2', '2'],
['a', '1', '1']],
dtype='<U1')

关于python - np.lexsort 在升序和降序之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68469371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com