鉴于每个列表都已排序,将三个列表排序到一个列表中

时间:2013-09-26 15:14:28

标签: python arrays sorting multidimensional-array

我有三个嵌套数组,包含大约10,000个元素(每个数组都有不同数量的元素)。这些数组是根据0th元素排序的,每个内部列表中的1st元素都没有实际模式。

例如,

a = np.array([[1,13],[2,36],[5,63],[10,35],[11,2]...])
b = np.array([[1,13],[3,32],[7,55],[10,30],[13,21],[15,10]...])
c = np.array([[2,10],[4,36],[5,58],[8,5]...])

我需要做的是组合数组,然后根据第0个元素对它们进行排序。我知道一个使用

的简单方法

D = np.concatenate((a,b,c))

将它们组合起来,然后使用,

D_sort =sorted(D, key = itemgetter(0))

对它们进行排序w.r.t第0个元素。但是,这非常耗时,而且我一直想知道是否存在使用每个数组a,b和c中的第0个元素进行排序的事实的解决方案。

重申一下,是否有一种有效的方法可以组合三个嵌套数组并在第0个元素中对它们进行排序,因为每个单独数组中的第0个元素已经排序了?

对于给出的示例,输出将为

[([ 1, 13], [ 1, 13],[ 2, 36],[ 2, 10],[ 3, 32],[ 4, 36],[ 5, 63],[ 5, 58],[ 7, 55],[8, 5],[10, 35],[10, 30],[11,  2],[13, 21],[15, 10])]

2 个答案:

答案 0 :(得分:0)

看看heapq.merge - 它不能满足您的需求吗?

答案 1 :(得分:0)

  
    

但是,这非常耗时

  

我认为这取决于你的观点。考虑这些时间:

In [84]: a,b,c=(sorted([random.randint(1,1000000),random.randint(1,1000000)] for _ in range(random.randint(9000,11000))) for _ in range(3))

In [85]: %timeit sorted(a+b+c)
100 loops, best of 3: 7.38 ms per loop

In [86]: %timeit heapq.merge(sorted(a),sorted(b),sorted(c))
100 loops, best of 3: 2.53 ms per loop

In [87]: %timeit heapq.merge(a,b,c)
1000000 loops, best of 3: 427 ns per loop

注意:我只能拨打heapq.merge,因为我的输入已完全排序。

显然heapq.merge更快(10 4 ),但如果你的输入没有完全排序,那么它根本就不是一个选项。我相信heapq是纯python,因此您可以使用heapq.merge参数重新实现key=