使用两个轴排序约束排序三维numpy数组

时间:2015-06-25 08:42:31

标签: python arrays sorting 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]])

为方便起见,请分别调用三个维xyz。我想根据递减顺序y的值对我的数组进行排序。

我知道我可以做到这一点
arr[arr[:, 1].argsort()[::-1]]

然而,第二个约束是对于同一y - 值的多次出现,我希望以x的值递增值。 xy的值都可以为负数。

我尝试先沿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循环。我怎样才能对数组进行排序?

1 个答案:

答案 0 :(得分:4)

一种方法是使用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 ]])