基于一列对二维数组进行排序

时间:2014-07-29 15:20:09

标签: python sorting cython

我希望根据例如第二列a two-dimensional array进行排序(如果行根据从低到高的顺序排序,所有其他行具有相同的索引根据第二列中的新订单对此列进行混洗)。在python中很容易实现它。

 d=np.array([[ 0.98807639,  0.17761071,  0.02576818],
            [ 0.90376256,  0.91729465,  0.42179004],
            [ 0.73540802,  0.38300233,  0.99331352],
            [ 0.99808863,  0.83837682,  0.16279504],
            [ 0.34154819,  0.6701753 ,  0.85538715],
            [ 0.15164261,  0.2007122 ,  0.80347646]])

data=np.array(sorted(d, key=lambda  l:l[1]))
data=np.array([[ 0.98807639,  0.17761071,  0.02576818],
               [ 0.15164261,  0.2007122 ,  0.80347646],
               [ 0.73540802,  0.38300233,  0.99331352],
               [ 0.34154819,  0.6701753 ,  0.85538715],
               [ 0.99808863,  0.83837682,  0.16279504],
               [ 0.90376256,  0.91729465,  0.42179004]])

但是我需要在cython中执行相同的过程,以便提高代码的速度,因为numpy模块非常慢。在c中有函数qsort,但我不知道如何为2d数组实现它,因为我对c中的指针结构不是很熟悉。如何在cython中完成大型阵列的代码加速?

1 个答案:

答案 0 :(得分:2)

  

但我需要在cython中执行相同的程序,以便改进   由于numpy模块非常慢,我的代码速度很快。

你并没有真正使用numpy模块。你的命令

data=np.array(sorted(d, key=lambda  l:l[1]))

使用非numpy lambda和纯Python函数sorted来构造Python列表,然后在完成所有新建numpy数组之后。< / p>

对于小到6x3的数组,你只能通过numpy工作得到一对因子 - 各种开销太高 - 但对于更大的数组,你可以获得显着的好处(这里使用argsort):

>>> d = np.random.random((10**6, 3))
>>> # slow method
>>> %timeit np.array(sorted(d, key=lambda  l:l[1]))
1 loops, best of 3: 2.56 s per loop
>>> # faster method
>>> %timeit d[d[:,1].argsort()]
1 loops, best of 3: 197 ms per loop

(请注意,这仅按第1列排序;您的标题和代码仅引用一列,因此我忽略了您对#34的引用;第三列中的新订单&#34;。)< / p>

相关问题