2017-08-30 96 views
2

我需要根据第一个子数组中的值尽可能快地排序多维数组(该行应用了数百万次)。快速排序多维数组

下面是我的原始线,我的尝试在改善其性能不起作用。据我所见,我的numpy方法只是正确排序第一个子数组,而没有其余的。

我在做什么错,我该如何提高排序的性能?

import numpy as np 

# Generate some random data. 
# I receive the actual data as a list, hence the .tolist() 
aa = np.random.rand(10, 2000).tolist() 

# This is the original line I need to process faster. 
b1 = zip(*sorted(zip(*aa), key=lambda x: x[0])) 

# This is my attempt at improving the above line's performance 
b2 = np.sort(np.asarray(aa).T, axis=0).T 

# Check if all sub-arrays are equal 
for a, b in zip(*[b1, b2]): 
    print(np.array_equal(a, b)) 
+1

马上,您可以尝试用'operator.itemgetter(0)'替换'lambda x:x [0]'。 – chepner

+0

谢谢,我现在就试试。但为什么'numpy'方法不起作用?我究竟做错了什么? – Gabriel

回答

4

不过,当谈到lambdas,但是从什么小我从你的代码,了解一个新手 - 这似乎在你lambda方法,使用的是x[0]得到排序键,然后使用这些拉出值aa中的每个元素。用NumPy术语来说,这意味着获得阵列版本中第一行的排序索引,然后索引到每一行(因为aa的每个元素都变为数组a的每一行)。这基本上是列索引。此外,看起来sorted维持相同元素的顺序。所以,我们需要使用argsort(kind='mergesort')

因此,我们可以简单地做 -

a[:, a[0].argsort(kind='mergesort')] # a = np.array(aa) 

在你NumPy的代码,你什么都不做那些五花八门的,所以没有给予正确的结果。

+0

谢谢!这比我原来的方法快了20倍。你能解释我在使用'numpy'和移调时做错了什么吗?这样我可以从我的错误中学习:) – Gabriel

+1

@Gabriel看看编辑是否有意义。 – Divakar

+0

非常感谢Divakar的解释! – Gabriel