我们需要使用按排序顺序保留的索引列表,而不是将第k个参数作为标量输入。因此,要保持第一个
5元素的排序性质
np.argpartition(a,5)[:5],只需执行-
np.argpartition(a,range(5))[:5]
这里是一个示例,目的是为了使事情更清楚:
In [84]: a = np.random.rand(10)In [85]: aOut[85]: array([ 0.85017222, 0.19406266, 0.7879974 , 0.40444978, 0.46057793, 0.51428578, 0.03419694, 0.47708 , 0.73924536, 0.14437159])In [86]: a[np.argpartition(a,5)[:5]]Out[86]: array([ 0.19406266, 0.14437159, 0.03419694, 0.40444978, 0.46057793])In [87]: a[np.argpartition(a,range(5))[:5]]Out[87]: array([ 0.03419694, 0.14437159, 0.19406266, 0.40444978, 0.46057793])
请注意,这
argpartition在性能方面是有意义的,如果我们希望获取一小部分元素的排序索引,那么可以说元素
k数占元素总数的一小部分。
让我们使用一个更大的数据集,并尝试获取所有元素的排序索引,以使上述要点更清楚:
In [51]: a = np.random.rand(10000)*100In [52]: %timeit np.argpartition(a,range(a.size-1))[:5]10 loops, best of 3: 105 ms per loopIn [53]: %timeit a.argsort()1000 loops, best of 3: 893 µs per loop
因此,要对所有元素进行排序
np.argpartition并不是要走的路。
现在,假设我想只获取具有该大数据集的前5个元素的排序索引,并保持这些元素的顺序-
In [68]: a = np.random.rand(10000)*100In [69]: np.argpartition(a,range(5))[:5]Out[69]: array([1647, 942, 2167, 1371, 2571])In [70]: a.argsort()[:5]Out[70]: array([1647, 942, 2167, 1371, 2571])In [71]: %timeit np.argpartition(a,range(5))[:5]10000 loops, best of 3: 112 µs per loopIn [72]: %timeit a.argsort()[:5]1000 loops, best of 3: 888 µs per loop
在这里非常有用!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)