对于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数组行为? 谢谢!
答案 0 :(得分:3)
numpy.argsort
会沿其最后一个轴对多维数组进行排序。您的s.shape
与ar.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)])
最后一个是家庭作业。