我有一个要排序的三维numpy数组.
数组的示例由以下示例给出:
arr = numpy.array([[4., 5., .1], [-2., 5., .3], [-1., -3., .2], [5, -4, .1], [2., 2., .25], [-2., 0., .1], [-1.5, 0., .1], [1., -3., .1], [-2., 8, .1]])
为了方便起见,我们分别调用三个维度x,y和z.我想根据y的值对我的数组进行降序排序.我知道我可以做到
arr[arr[:, 1].argsort()[::-1]]
但是,第二个约束条件是,对于多次出现的相同y值,我希望按照x的递增值进行排序. x和y的值都可以为负.
我尝试先沿x排序,然后沿y排序,希望x顺序保持不变.不幸的是,这种情况并非如此.
arr的排序数组应为
sorted_arr = numpy.array([[-2., 8, .1], [-2., 5., .3], [4., 5., .1], [2., 2., .25], [-2., 0., .1], [-1.5, 0., .1], [-1., -3., .2], [1., -3., .1], [5, -4, .1]])
由于实际的数组很大,所以我不想使用for循环.我如何排序我的数组?
解决方法:
一种方法可能是使用np.lexsort
来对第二列和第一列进行排序.
由于默认情况下这会按升序对值进行排序,因此您可以将第二列乘以-1以“翻转”值,以便将这些值从高到低排序.
该函数返回一个索引数组,可用于重新排列arr的行:
>>> arr[np.lexsort((arr[:, 0], -arr[:, 1]))]
array([[-2. , 8. , 0.1 ],
[-2. , 5. , 0.3 ],
[ 4. , 5. , 0.1 ],
[ 2. , 2. , 0.25],
[-2. , 0. , 0.1 ],
[-1.5 , 0. , 0.1 ],
[-1. , -3. , 0.2 ],
[ 1. , -3. , 0.1 ],
[ 5. , -4. , 0.1 ]])