通过第二个值的总和对3D数组进行排序

时间:2015-06-04 13:17:40

标签: python numpy

我试图对3D阵列进行排序并且收效甚微。我已经阅读了有关如何针对两个维度完成此操作的各种方法,但我似乎无法将其扩展。

我有一个像:

这样的数组
[[[0, 25], [1, 20], [2, 80], [0, 0], [0, 0], [0, 0]], 
[[0, 80], [0, 20], [1, 25], [1, 40], [2, 99], [0, 0]], 
[[0, 99], [1, 40], [2, 80], [0, 0], [0, 0], [0, 0]]]

我希望按第二个值的总和对其进行排序。 我用来订购的标准是第二个值的总和。 E.g:

 25+20+80 = 125
 80+20+25+40+99 = 264
 99+40+80 = 219

所以:

 [[[0, 80], [0, 20], [1, 25], [1, 40], [2, 99], [0, 0]], 
 [[0, 99], [1, 40], [2, 80], [0, 0], [0, 0], [0, 0]]], 
 [[0, 25], [1, 20], [2, 80], [0, 0], [0, 0], [0, 0]]]

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我想我明白你需要什么。假设您的数组存储在a中。

>>> a
Out[19]: 
array([[[ 0, 25],
        [ 1, 20],
        [ 2, 80],
        [ 0,  0],
        [ 0,  0],
        [ 0,  0]],

       [[ 0, 80],
        [ 0, 20],
        [ 1, 25],
        [ 1, 40],
        [ 2, 99],
        [ 0,  0]],

       [[ 0, 99],
        [ 1, 40],
        [ 2, 80],
        [ 0,  0],
        [ 0,  0],
        [ 0,  0]]])

a[:, :, 1]访问最里面维度的第二个元素,因此您可以对此进行求和(在水平轴上,即轴= 1)以获得排序所需的值:

>>> a[:, :, 1]
Out[20]: 
array([[25, 20, 80,  0,  0,  0],
       [80, 20, 25, 40, 99,  0],
       [99, 40, 80,  0,  0,  0]])
>>> b = np.sum(a[:, :, 1], axis=1)
>>> b
Out[21]: array([125, 264, 219])

使用np.argsort获取已排序的索引,而不是排序的数组:

>>> i = np.argsort(b)[::-1] # Reverse the array for descending order
>>> i
Out[23]: array([1, 2, 0])

最后,根据需要使用索引访问数组:

>>> a[i, :, :]
Out[25]: 
array([[[ 0, 80],
        [ 0, 20],
        [ 1, 25],
        [ 1, 40],
        [ 2, 99],
        [ 0,  0]],

       [[ 0, 99],
        [ 1, 40],
        [ 2, 80],
        [ 0,  0],
        [ 0,  0],
        [ 0,  0]],

       [[ 0, 25],
        [ 1, 20],
        [ 2, 80],
        [ 0,  0],
        [ 0,  0],
        [ 0,  0]]])

希望这有帮助!