【问题标题】:sort 3D array by the sum of the second value按第二个值的总和对 3D 数组进行排序
【发布时间】:2015-06-04 13:17:40
【问题描述】:

我正在尝试对 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]]]

我希望它按第二个值的总和排序。 我用来订购的标准是第二个值的总和。 例如:

 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]]]

谁能帮帮我?

【问题讨论】:

  • 第二个值是什么?每个列表?
  • 您指定的第二个数组似乎没有以任何方式排序。如果是,请解释对第二个数组进行了什么样的精确排序?
  • 您不能按原样对多维数据进行排序。您需要映射到一维并定义排序标准。比如向量(2,3)和(3,1)没有排序关系,但是如果你把它映射到范数(一维),那么你就可以通过某种方式排序。
  • 你可以这样做:sorted(array[::-1], key=lambda x: x[2])

标签: python numpy


【解决方案1】:

我想我明白你需要什么。假设您的数组存储在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] 访问最内层维度的第二个元素,因此您可以对其求和(在水平轴上,即 axis=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]]])

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2021-11-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    相关资源
    最近更新 更多