在numpy中选择2d数组的索引

时间:2010-01-06 22:33:55

标签: python numpy

这在一个方面非常有效:

# This will sort bar by the order of the values in foo
(Pdb) bar = np.array([1,2,3])
(Pdb) foo = np.array([5,4,6])
(Pdb) bar[np.argsort(foo)]
array([2, 1, 3])

但我如何在两个方面做到这一点? Argsort运行良好,但选择不再有效:

(Pdb) foo = np.array([[5,4,6], [9,8,7]])
(Pdb) bar = np.array([[1,2,3], [1,2,3]])
(Pdb)  bar[np.argsort(foo)]
*** IndexError: index (2) out of range (0<=index<=1) in dimension 0
(Pdb) 

我希望这能输出:

array([[2, 1, 3], [3, 2, 1]])

有任何线索怎么做?

谢谢! / YGA

编辑:take()似乎做对了,但实际上只需要第一行的元素(超级混乱)。

你可以看到,如果我改变了bar的值:

(Pdb) bar = np.array([["1","2","3"], ["A", "B", "C"]])
(Pdb) bar.take(np.argsort(foo))
array([['2', '1', '3'],
       ['3', '2', '1']], 
      dtype='|S1')
(Pdb) 

3 个答案:

答案 0 :(得分:2)

你想要

bar[[[0],[1]], np.argsort(foo)]

这是因为您需要两个索引来索引bar[[0], [1]]是为了获得正确的广播。有关完全相同的问题和答案,请参阅this post on numpy-discussion邮件列表。

答案 1 :(得分:1)

提供了一个很好的通用解决方案(有n行排序)at this post,即

bar[np.arange(foo.shape[0])[:,None], np.argsort(foo)]

答案 2 :(得分:0)

bar.take(np.argsort(foo))产生了您想要的输出,因此您应该查看其documentation以确保它实际上符合您的需要。

编辑:

试试这个:bar.take(np.argsort(foo.ravel()).reshape(foo.shape))