【问题标题】:python - sorting np 2d array by 2 columns (acending, decending)python - 按2列排序np 2d数组(升序,降序)
【发布时间】:2017-03-21 05:51:19
【问题描述】:

我有以下代码/数据:

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]

运行时仍未得到答复。

【问题讨论】:

  • This 可能会有所帮助。

标签: python arrays numpy


【解决方案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()]

【讨论】:

  • 是的,它好多了。你认为它是最好的运行时吗?
  • @EranMoshe 第二列会一直在 [0,1) 区间吗?
  • 嗯在某些情况下我可以强制它在 [0,1) 之间
  • @EranMoshe 在那里添加了更多方法。
  • 谢谢伙计。我将对它们进行运行时检查
猜你喜欢
  • 2011-08-25
  • 2018-11-20
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2020-02-08
  • 2012-11-08
  • 2023-03-07
  • 2012-12-21
相关资源
最近更新 更多