滤波直方图边缘和计数
问题描述:
考虑一个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
现在,说我要过滤perc
和edges
这样我只能用百分比和边缘结束了对包含一系列新[m, M]
内值。 '
即,我想与内[m, M]
值相对应的间隔中的子阵列的perc
和edges
工作。不用说,新的百分比数组仍将指输入数组的总分数。我们只是想过滤perc
和edges
以最终得到正确的子阵列。
如何后处理perc
和edges
这样做?
m
和M
的值可以是任何数量的当然。在上面的例子中,我们可以假设例如m = 0
和M = 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.])
答
那么你可能需要一些这方面的数学。垃圾箱间隔相等,因此您可以确定哪是第一个包含并且是最后一个使用每个区间的宽度:
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两个如果要包括含m
或M
垃圾桶! - 但随后要小心,你不与第一负值最终也是最后一次)
现在你知道多少箱包括:
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
谢谢,但我们现在怎么办用'mask'也过滤'perc'? –