python - 按2列排序np 2d数组(acending,decending)

时间:2016-11-07 19:10:49

标签: 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],
])

我想对2d数组进行排序:主要是按照数据[:,1]的顺序(从最低到最高),其次,数据[:,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]

运行时仍然没有答案。

1 个答案:

答案 0 :(得分:1)

您可以直接使用带有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()]