簡體   English   中英

使用兩個軸排序約束對三維numpy數組進行排序

[英]Sort three dimensional numpy array with two axes sorting constraints

我有一個三維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循環。 我怎樣才能對數組進行排序?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM