滤波直方图边缘和计数

问题描述:

考虑一个numpy的阵列,它返回百分比的直方图计算:滤波直方图边缘和计数

# 500 random numbers between 0 and 10,000 
values = np.random.uniform(0,10000,500) 

# Histogram using e.g. 200 buckets 
perc, edges = np.histogram(values, bins=200, 
          weights=np.zeros_like(values) + 100/values.size) 

上述返回两个数组:

  • perc含有%(即百分比)值的内每对连续edges[ix]edges[ix+1]中的总数。
  • 长度len(hist)+1

edges现在,说我要过滤percedges这样我只能用百分比和边缘结束了对包含一系列新[m, M]。 '

即,我想与内[m, M]值相对应的间隔中的子阵列的percedges工作。不用说,新的百分比数组仍将指输入数组的总分数。我们只是想过滤percedges以最终得到正确的子阵列。

如何后处理percedges这样做?

mM的值可以是任何数量的当然。在上面的例子中,我们可以假设例如m = 0M = 200

m = 0; M = 200 
mask = [(m < edges) & (edges < M)] 
>>> edges[mask] 
array([ 37.4789683 , 87.07491593, 136.67086357, 186.2668112 ]) 

让我们在一个较小的数据集工作,以便更容易理解:

np.random.seed(0) 
values = np.random.uniform(0, 100, 10) 
values.sort() 
>>> values 
array([ 38.34415188, 42.36547993, 43.75872113, 54.4883183 , 
     54.88135039, 60.27633761, 64.58941131, 71.51893664, 
     89.17730008, 96.36627605]) 

# Histogram using e.g. 10 buckets 
perc, edges = np.histogram(values, bins=10, 
          weights=np.zeros_like(values) + 100./values.size) 

>>> perc 
array([ 30., 0., 20., 10., 10., 10., 0., 0., 10., 10.]) 

>>> edges 
array([ 38.34415188, 44.1463643 , 49.94857672, 55.75078913, 
     61.55300155, 67.35521397, 73.15742638, 78.9596388 , 
     84.76185122, 90.56406363, 96.36627605]) 

m = 0; M = 50 
mask = (m <= edges) & (edges < M) 
>>> mask 
array([ True, True, True, False, False, False, False, False, False, 
     False, False], dtype=bool) 

>>> edges[mask] 
array([ 38.34415188, 44.1463643 , 49.94857672]) 

>>> perc[mask[:-1]][:-1] 
array([ 30., 0.]) 

m = 40; M = 60 
mask = (m < edges) & (edges < M) 
>>> edges[mask] 
array([ 44.1463643 , 49.94857672, 55.75078913]) 
>>> perc[mask[:-1]][:-1] 
array([ 0., 20.]) 
+0

谢谢,但我们现在怎么办用'mask'也过滤'perc'? –

那么你可能需要一些这方面的数学。垃圾箱间隔相等,因此您可以确定哪是第一个包含并且是最后一个使用每个区间的宽度:

bin_width = edges[1] - edges[0] 

现在计算的第一个和最后一个有效斌:

first = math.floor((m - edges[0])/bin_width) + 1 # How many bins from the left 
last = math.floor((edges[-1] - M)/bin_width) + 1 # How many bins from the right 

(忽略+1两个如果要包括含mM垃圾桶! - 但随后要小心,你不与第一负值最终也是最后一次)

现在你知道多少箱包括:

valid_edges = edges[first:-last] 
valid_perc = perc[first:-last] 

这将排除第一个first点和最后一个last点。

可能是因为我没有对舍入给予足够的重视,并且包含了“一个一个”的错误,但我认为这个想法是合理的。 :-)

您可能需要捕捉像M > edges[-1]这样的特殊情况,但为了便于阅读,我没有包含这些内容。


或者如果垃圾桶不等距使用布尔口罩,而不是计算:

first = edged[edges < m].size + 1 
last = edged[edges > M].size + 1