我知道有numpy.percentile(myArray,5)
,但我知道在幕后这将首先对数组进行完整排序,如果我只需要排序最小的 5% 的值,这是低效的。我还读到堆排序方法对这个部分排序问题很有用,但我似乎找不到适用于 2D numpy 数组的实现。
这是我尝试过的:
import numpy, time
#create some fake data (like an opencv greyscale image)
a = numpy.random.randint(0,256,640*480).reshape([640,480]).astype('uint8')
#time the numpy.percentile approach
start = time.time() ; temp = numpy.percentile(a,5) ; print time.time()-start
这在我的系统上大约需要 15 毫秒(对于我的实时应用程序来说太慢了)。
尝试堆:
import heapq
start = time.time() ; temp = heapq.nsmallest(int(640*480*.05),a.flatten())[-1] ; print time.time()-start
在我的系统上花费 300 毫秒;我希望 heapq 可以加快速度!