这在一个方面非常有效:
# 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)
答案 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))