我有以下代码/数据:

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],
])


我想对2d数组进行排序:主要按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 - python-按2列对np 2d数组进行排序(升序,降序),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40472759/

10-10 17:29