带有两个轴排序约束的三维numpy数组排序

我有一个要排序的三维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 ]])
上一篇:java-根据整数对ArrayList进行排序


下一篇:如何读取日期的文本文件并将其转换为可以在C#中排序的数组?