簡體   English   中英

如何根據另一個2d numpy數組給定的索引對2d numpy數組的行進行排序

[英]How do I sort the rows of a 2d numpy array based on indices given by another 2d numpy array

例:

arr = np.array([[.5, .25, .19, .05, .01],[.25, .5, .19, .05, .01],[.5, .25, .19, .05, .01]])
print(arr)
[[ 0.5   0.25  0.19  0.05  0.01]
 [ 0.25  0.5   0.19  0.05  0.01]
 [ 0.5   0.25  0.19  0.05  0.01]]

idxs = np.argsort(arr)
print(idxs)
[[4 3 2 1 0]
 [4 3 2 0 1]
 [4 3 2 1 0]]

如何使用idxs索引arr 我想做類似arr[idxs] ,但這不起作用。

這不是最漂亮的,但我認為

>>> arr[np.arange(len(arr))[:,None], idxs]
array([[ 0.01,  0.05,  0.19,  0.25,  0.5 ],
       [ 0.01,  0.05,  0.19,  0.25,  0.5 ],
       [ 0.01,  0.05,  0.19,  0.25,  0.5 ]])

應該管用。 第一項給出我們想要的x坐標(使用在最后一個單軸上的廣播):

>>> np.arange(len(arr))[:,None]
array([[0],
       [1],
       [2]])

使用idxs提供y坐標。 請注意,如果我們使用了unravel_indexunravel_index使用的x坐標將始終為0:

>>> np.unravel_index(idxs, arr.shape)[0]
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

這樣的事情怎么樣:

我更改了變量以使示例更清楚,但是基本上您需要按兩個2D數組進行索引。

In [102]: a = np.array([[1,2,3], [4,5,6]])

In [103]: b = np.array([[0,2,1], [2,1,0]])

In [104]: temp = np.repeat(np.arange(a.shape[0]), a.shape[1]).reshape(a.shape).T 

          # temp is just [[0,1], [0,1], [0,1]]
          # probably can be done more elegantly

In [105]: a[temp, b.T].T
Out[105]: 
array([[1, 3, 2],
       [6, 5, 4]])

暫無
暫無

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

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