如何根据列值对numpy数组进行排序?
我有一个numpy的阵列看起来像这样:如何根据列值对numpy数组进行排序?
>>> array_text[:10]
array([[1, 52.51, 12, 0],
[1, 52.52, 52, 2],
[1, 52.53, 1, 6],
[2, 52.51, 20, 0],
[2, 52.52, 75, 76],
[2, 52.53, 6, 33],
[3, 52.51, 84, 0],
[3, 52.52, 39, 68],
[3, 52.53, 0, 13],
[4, 52.51, 1, 0]], dtype=object)
我想要做的就是按照其第二列排序,按降序排列。所以我想要的结果是:
>>> array_text[:10]
array([[1, 52.53, 1, 6],
[1, 52.52, 52, 2],
[1, 52.51, 12, 0],
[2, 52.53, 6, 33],
[2, 52.52, 75, 76],
[2, 52.51, 20, 0],
[3, 52.53, 0, 13],
[3, 52.52, 39, 68],
[3, 52.51, 84, 0],
[4, 52.51, 1, 0]], dtype=object)
我该怎么做?
您可以使用numpy.lexsort
。颠倒列的技巧是通过乘以-1来实现的。
import numpy as np
arr[np.lexsort((-1*arr[:,1], arr[:,0]))]
输出继电器:
array([[1, 52.53, 1, 6],
[1, 52.52, 52, 2],
[1, 52.51, 12, 0],
[2, 52.53, 6, 33],
[2, 52.52, 75, 76],
[2, 52.51, 20, 0],
[3, 52.53, 0, 13],
[3, 52.52, 39, 68],
[3, 52.51, 84, 0],
[4, 52.51, 1, 0]], dtype=object)
非常感谢您的帮助!我从中学到了很多东西! – maynull
@maynull - 不客气 – Transhuman
处理此问题的最简单方法是使用熊猫,因为已使用sort_values
方法将功能内置到数据框中。
import pandas as pd
import numpy as np
x = np.array([[1, 52.51, 12, 0],
[1, 52.52, 52, 2],
[1, 52.53, 1, 6],
[2, 52.51, 20, 0],
[2, 52.52, 75, 76],
[2, 52.53, 6, 33],
[3, 52.51, 84, 0],
[3, 52.52, 39, 68],
[3, 52.53, 0, 13],
[4, 52.51, 1, 0]], dtype=object)
df = pd.DataFrame(x, columns=list('ABCD'))
df.sort_values(['A', 'B'], ascending=[True, False]).values
# returns:
array([[1, 52.53, 1, 6],
[1, 52.52, 52, 2],
[1, 52.51, 12, 0],
[2, 52.53, 6, 33],
[2, 52.52, 75, 76],
[2, 52.51, 20, 0],
[3, 52.53, 0, 13],
[3, 52.52, 39, 68],
[3, 52.51, 84, 0],
[4, 52.51, 1, 0]], dtype=object)
非常感谢您的帮助!我从数据框中创建数组,所以你的答案也是非常有用的!这是一个耻辱,我可以选择只有一个有用的答案! – maynull
你的意思是,保持在排序在第一个的每个值下降在第二列顺序的第一列和升序? – James
@詹姆斯是的!那就是我的意思。 – maynull