按特定尺寸和元素对3D数组排序

时间:2019-05-16 01:36:36

标签: python arrays numpy sorting numpy-ndarray

如果我有3D阵列; 例如:

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

我想根据 3rd dim&1st value。

对它们进行排序。

这意味着结果应该是

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

如何在python中制作它?

Thx

3 个答案:

答案 0 :(得分:1)

一种方法是使用list.sort方法或sorted函数以及 key 参数的适当值(请参阅文档:howto/sorting)。

Python文档在解释 key 参数的用途方面做得很好:

“ list.sort()和sorted()都有一个 key 参数,用于指定要在每个列表元素之前调用的功能 >进行比较。”

例如,让我们对您列表的第一项进行排序:

first=[[10, 2], [5, 3], [4, 4]]

def by_first(element):

    """
    Sort a two-dimensional list by the first element 

    Param: element of the list i.e [10, 2]
    Return: first item of element
    """

    return element[0]

所以,要对上面的列表进行排序

sorted(first,key=by_first)

最后,要解决最初的问题(三维列表),我们只需对列表中的每个项目

进行上述操作
list_numbers = [[[10, 2], [5, 3], [4, 4]], [[7, 6], [4, 2], [5, 8]]]

[sorted(entry, key=by_first) for entry in list_numbers]

答案 1 :(得分:1)

下面的代码是实现所需输出的简单解决方法。

list= [[[10,2],[5,3],[4,4]],[[7,6],[4,2],[5,8]]]

for i in range(len(list)):
    list[:][:][i].sort(key=lambda x: x[:][:][0])

print(list)

通过 for 循环的每次迭代,元素一次被排序一个列表。

答案 2 :(得分:0)

如果您正在寻找与数组(而非列表)更相关的内容,则可以尝试以下操作:

import numpy as np

a = np.array([[[10,2],
               [5,3],
               [4,4]],

              [[7,6],
               [4,2],
               [5,8]]])
b = np.zeros(a.shape)

sorted_idx = np.argsort(a, axis=1)

for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        b[i, j] = a[i, sorted_idx[i, j, 0]]

print(b.astype(int))

# [[[ 4  4]
#   [ 5  3]
#   [10  2]]
# 
#  [[ 4  2]
#   [ 5  8]
#   [ 7  6]]]

请注意,实际上,根据您的预期输出,您需要按axis=1的第一个元素而不是最后一个轴进行排序。