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

标签 python arrays numpy

我有以下代码/数据:

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/

相关文章:

python - 在 numpy rearray 中查找接近的元素

python - Numpy:修改特定位置的数组元素

java - 生成数字作为暴力应用程序的一部分

python - 如何绘制时间序列的倒数

python - 如何在 scikit-learn 随机森林的 graphviz-graph 中找到一个类?

python - 递归或迭代函数 (Python)

使用数组索引的 C# 性能

c# - c++ 结构指针转换为数组互操作 c#

python - 我怎样才能模拟 sqlite3.Cursor

python - 类实例未通过 isinstance 检查