将np.argsort()的结果转换为元组

时间:2019-03-05 00:01:15

标签: python-3.x numpy

我有一个充满浮点数的10x10数组,想获取索引,该索引将对该数组进行排序并将其放入一个数组或元组列表中。对于一个较小的示例,我有:

A = [[0,1,2],[4,9,3],[5,8,7]]

(不是10x10,但这只是示例)

然后我要创建:

ind = [(0,0),(0,1),(0,2),(1,2),(1,0),(2,0),(2,2),(2,1),(1,1)]

现在我尝试了

ind = np.argsort(A,axis=0)

类似于

ind = [0 1 2 12 10 20 22 21 11]

最终目标是能够做到

A[ind[i]] 

并获得第i个最小数字

1 个答案:

答案 0 :(得分:2)

In [55]: A = np.array([[0,1,2],[4,9,3],[5,8,7]])                                                                       

argsort和轴None对整个东西进行排序:

In [56]: idx=np.argsort(A,None)                                                 
In [57]: idx                                                                    
Out[57]: array([0, 1, 2, 5, 3, 6, 8, 7, 4])

有些索引为A的平整或斜切形式

In [58]: A.flat[idx]                                                            
Out[58]: array([0, 1, 2, 3, 4, 5, 7, 8, 9])

第三小:

In [59]: A.flat[idx[2]]                                                         
Out[59]: 2

我们可以使用以下方法获得2d索引:

In [60]: np.unravel_index(idx,A.shape)                                          
Out[60]: (array([0, 0, 0, 1, 1, 2, 2, 2, 1]), array([0, 1, 2, 2, 0, 0, 2, 1, 1]))

我相信这些值与您所需的索引集匹配-但是我必须将它们转换为元组才能进行索引:

In [61]: np.transpose(np.unravel_index(idx,A.shape))                            
Out[61]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 2],
       [1, 0],
       [2, 0],
       [2, 2],
       [2, 1],
       [1, 1]])
In [63]: A[tuple(_61[2])]                                                       
Out[63]: 2