我有一个三维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
循环。我怎样才能对数组进行排序?
答案 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 ]])