我希望根据例如第二列对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中完成大型阵列的代码加速?
答案 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>