2017-09-11 46 views
0

我有一个长度超过1'000'000的给定数组,以及0255(包括)之间的整数值。现在我想在x轴上绘制0255之间的整数,在y轴上绘制给定数组中相应x值的数量(在我当前的代码中称为Arr)。Python中的振幅谱

我想过这个代码:

list = [] 
    for i in range(0, 256): 
     icounter = 0 
     for x in range(len(Arr)): 
      if Arr[x] == i: 
       icounter += 1 
     list.append(icounter) 

但有什么办法,我可以做到这一点快一点(它需要我的时刻几分钟)?我想过一个import ...,但无法找到一个好的包。

+0

你基本上只是试图让一个直方图,所以['numpy.histogram'(HTTPS:/ /docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html)或['scipy.stats.histogram'](https://docs.scipy.org/doc/scipy-0.14.0/ reference/generated/scipy.stats.histogram.html)将会非常高效并完成此任务 – CoryKramer

+0

@CoryKramer Thx它的工作原理。 – G4W

+0

这个问题已经在这里解答https://stackoverflow.com/questions/10741346/numpy-most-efficient-frequency-counts-for-unique-values-in-an-array –

回答

1

使用numpy.bincount该任务(寻找更多的细节here

import numpy as np 
list = np.bincount(Arr) 
0

虽然我完全,你应该使用标准直方图算法以前的答案同意,这是很容易大大加快自己的实现。其问题在于,您一遍又一遍地通过每个垃圾箱的整个输入。这将是更快,只处理一次输入,然后只写入相关斌:

def hist(arr): 
    nbins = 256 
    result = [0] * nbins # or np.zeroes(nbins) 
    for y in arr: 
     if y>=0 and y<nbins: 
      result[y] += 1 
    return result