根据一列排序二维数组
我想要对一个二维数组
进行排序,比如说按照第二列来排序(如果行是从小到大排序的,那么所有在这个列中有相同索引的其他行也会根据第二列的新顺序进行重新排列)。在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
的函数,但我不知道怎么在二维数组上使用它,因为我对c
中的指针结构不太熟悉。请问在cython
中应该怎么做,才能显著加快处理大数组的速度呢?
1 个回答
2
但是我需要在Cython中做同样的操作,以提高我的代码速度,因为numpy模块非常慢。
其实你并没有真正使用numpy模块。你的命令
data=np.array(sorted(d, key=lambda l:l[1]))
使用了一个非numpy的lambda表达式,以及一个纯Python的函数sorted
,这个函数会构建一个Python列表,最后在完成这些操作后,你才创建了一个新的numpy
数组。
对于像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列进行排序;你的标题和代码只提到了一列,所以我忽略了你提到的“第三列的新顺序”。)