python中element什么意思_什么是Python中等效
的’nth_element’函数?
我想在random在python中的意思
python中实现Vantage Point Tree,但它使⽤C中的std :: nth_element.
所以我想在Python或numpy中到等效的’nth_element’函数.
注意,nth_element只会对数组进⾏部分排序,⽽且它是O(N).
int the_array[10] = {4,5,7,3,6,0,1,2,9,8};
std::vector the_v(the_array,the_array+10);
std::nth_element (the_v.begin()+0, the_v.begin()+5, the_v.begin()+10);
现在⽮量可能是:
3,0,2,1,4,5,6,7,9,8
⽽且我不仅希望得到第n个元素,⽽且还希望重新安排列表的两部分,[3,0,2,1,4]和[6,7,9,8].
此外,nth_element⽀持接受⼀个可以⽐较两个元素的函数,例如,在下⾯,vector是⼀个向量op DataPoint,⽽DistanceComparator函数将⽐较两个点距离与_v.begin():
vector the_v;
for(int n = 0; n < N; n++) the_v[n] = DataPoint(D, n, X + n * D);
std::nth_element (the_v.begin()+0, the_v.begin()+5, the_v.begin()+10,
DistanceComparator(the_v.begin()));
编辑:
我已经使⽤了bhuvan-venkatesh的答案,并编写了⼀些代码来测试.
partition_timer = timeit.Timer("numpy.partition(a, 10000)",
"import numpy;numpy.random.seed(2);"+
"a = numpy.random.rand(10000000)")
print(partition_timer.timeit(10))
sort_timer = timeit.Timer("numpy.sort(a)",
"import numpy;numpy.random.seed(2);"+
"a = numpy.random.rand(10000000)")
print(sort_timer.timeit(10))
sorted_timer = timeit.Timer("sorted(a)",
"import numpy;numpy.random.seed(2);"+
"a = numpy.random.rand(10000000)")
print(sorted_timer.timeit(10))
结果:
2.2217168808
17.0386350155
281.301710844
然后,我将使⽤C代码进⾏更多测试.
但是有⼀个问题,当使⽤numpy时,它总会返回⼀个新数组,当我的数组很⼤时会浪费⼤量内存.我该怎么办呢
或者我只需为python编写C扩展.
EDIT2:
@ bhuvan-venkatesh感谢您推荐分区功能.
我使⽤如下的分区:
import numpy
@profile
def for_numpy():
numpy.random.seed(2)
a = numpy.random.rand(1e7)
for i in range(100):
a.partition(numpy.random.randint(1e6))
if __name__ == '__main__':
for_numpy()
并运⾏探查器,如:
python -m memory_profiler profiler_test.py
结果是:
Line # Mem usage Increment Line Contents
================================================
25 23.613 MiB 0.000 MiB @profile
26 def for_numpy():
27 23.613 MiB 0.000 MiB numpy.random.seed(2)
28 99.934 MiB 76.320 MiB a = numpy.random.rand(1e7)
29 100.004 MiB 0.070 MiB for i in range(100):
30 100.004 MiB 0.000 MiB a.partition(numpy.random.randint(1e6))
并且它不会复制整个数组,如:
numpy.partition(a,3)
结论:numpy.ndarray.partition是我想要到的.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。