gpt4 book ai didi

python - 按2列对np 2d数组进行排序(升序、降序)

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:35 29 4
gpt4 key购买 nike

我有以下代码/数据:

import numpy as np

data = np.array([
[12, 1, 0.7, 0],
[13, 2, 0.5, 1],
[41, 3, 0.3, 0],
[20, 2, 0.8, 0],
[51, 2, 0.7, 0],
[32, 0, 0.9, 0],
[17, 4, 0.7, 1],
[54, 1, 0.6, 1],
[22, 1, 0.4, 1],
[74, 0, 0.5, 0],
[11, 4, 0.3, 1],
[13, 3, 0.8, 0],
[15, 4, 0.3, 0],
[65, 3, 0.2, 1],
])

我想对二维数组进行排序:主要按 data[:, 1] 按升序排列(从最低到最高),其次按 data[:, 2] 按降序排列(从最高到最低)所以我想出了以下代码:

data[:, 2] = -data[:, 2]
ind = np.lexsort((data[:, 2], data[:, 1]))
data[:, 2] = -data[:, 2]
data = data[ind]
print data

结果:

[[ 32.    0.    0.9   0. ]
[ 74. 0. 0.5 0. ]
[ 12. 1. 0.7 0. ]
[ 54. 1. 0.6 1. ]
[ 22. 1. 0.4 1. ]
[ 20. 2. 0.8 0. ]
[ 51. 2. 0.7 0. ]
[ 13. 2. 0.5 1. ]
[ 13. 3. 0.8 0. ]
[ 41. 3. 0.3 0. ]
[ 65. 3. 0.2 1. ]
[ 17. 4. 0.7 1. ]
[ 11. 4. 0.3 1. ]
[ 15. 4. 0.3 0. ]]

它是正确的。但我想知道是否有更好的方法来做到这一点。首先是否可以在更短的运行时间内完成。其次,更简单的 pytonic 代码。

为了让它更短(并且更Pythonic),我可以这样做:

ind = np.lexsort((-data[:, 2], data[:, 1]))
data = data[ind]

运行时仍然没有答案。

最佳答案

您可以直接将否定的第二列与np.lexsort一起使用 -

data[np.lexsort((-data[:, 2], data[:, 1]))]

假设第一列中的非负整数值和第二列中的非负整数值,这是 argsort 的替代方案 -

data[(data[:,1]*(data[:,2].max()+1) - data[:,2]).argsort()]

如果第二列总是在 [0,1) 中包含元素,我们可以简单地 -

data[(data[:,1] - data[:,2]).argsort()]

关于python - 按2列对np 2d数组进行排序(升序、降序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40472759/

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