使用argsort进行Numpy索引

时间:2015-04-13 06:08:46

标签: python arrays numpy

对于1d索引数组,该数组上的argsort结果为您提供了一个排序数组。

ar = numpy.random.random(4)
s = numpy.argsort(ar)
ar[s].shape
(4,)

但是我得到了3d:

ar = numpy.random.random((2,3,2))
s = numpy.argsort(ar)
ar[s].shape
(2, 3, 2, 3, 2)

我如何获得与1d相同的3d数组行为? 谢谢!

1 个答案:

答案 0 :(得分:3)

除非另有说明,否则

numpy.argsort会沿其最后一个轴对多维数组进行排序。您的s.shapear.shape相同,但您甚至可以在不获取IndexErrors的情况下使用ar[s],这只是因为您选择了一个不错的形状。

您首先要考虑您真正想要排序的内容。说你有:

[[8, 7],
 [6, 5],
 [4, 3]]

你想得到什么?从左到右:

[[7, 8],
 [5, 6],
 [3, 4]]

或从上到下:

[[4, 3],
 [6, 5],
 [8, 7]]

或完全:

[[3, 4],
 [5, 6],
 [7, 8]]

最后一个可能最容易变平,然后重塑。

arf = ar.flatten()
s = numpy.argsort(arf)
arf[s].reshape(ar.shape)

第一个有点难:

s = numpy.argsort(ar)
numpy.array([[ar2[s2] for ar2, s2 in zip(ar1, s1)] for ar1, s1 in zip(ar, s)])

最后一个是家庭作业。