使用numpy.histogram中的条柱边缘时,Numpy.histogram()给出的条柱比预期的多

hivapdat  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(87)

我的目标是为图像的每个像素(在我的例子中是一个numpy数组)分配它福尔斯落入的频率。例如,我有像[0.5, 1, 2, 2, 4]这样的值和像[0, 1.5, 2.5, 3.5, 4.5]这样的bin边缘。所以第一个bin的频率应该是2,第二个2,第三个0和第四个1。所以结果应该是[2, 2, 2, 2, 1]
我的计划是首先使用numpy.histogram()来获得频率和bin边缘,然后使用numpy.digitize()和bin边缘来为每个像素分配bin索引,像素福尔斯落入其中。然后我想使用这些分配的索引在hist中查找相应的频率。但是我遇到的问题是numpy.digitize()给了我更多的垃圾箱,然后在hist中有,我不知道为什么。
我的代码如下所示:
首先,我有一个图像(一个numpy数组),看起来像这样:

a_noise = np.random.normal(0, 1, 40000).reshape((200,200))

接下来,我把它的直方图:

hist, bin_edges = np.histogram(a_noise, bins='fd')

现在我使用np. np将bin索引分配给像素。

a_binidx = np.digitize(a_noise, bin_edges, right=True)

结果我得到:

hist.shape

(109,)个bin,因此可能的索引范围从0到108。

bin_edges.shape

总共(110,) bin_edges,这对我来说是有意义的。但是当我检查给定的bin索引时,我得到的结果是:

np.unique(a_binidx)

array([ 0, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109])
最高指数为109。hist的最大可能指数是108。
为什么我的指数是109而不是108?

xdnvmnnf

xdnvmnnf1#

关于为什么会发生这种情况的解释出现在这里:numpy.digitize returns values out of range?简而言之,Digitize在bin边缘的一侧使用大于号(<),在另一侧使用大于或等于号(<=),因此等于最高(或最低,如果您使用right=True)bin边缘值的点将不会被认为属于该bin,因此您会得到另一个“bin”。如果有一个点等于直方图中可能的最高值(或最低值,如果right=True),则会发生这种情况。
您可以将bin_edges中的第一个值减少任何数量,它应该可以解决问题,因为该值将不等于bin的边缘。那么最高索引仍然等于hist.shape[0],但最低索引将是1而不是0。
举例来说:

a_noise = np.random.normal(0, 1, 40000).reshape((200,200))

hist, bin_edges = np.histogram(a_noise, bins='fd')
bin_edges[0] -= 0.1

a_binidx = np.digitize(a_noise, bin_edges, right=True)
print("hist shape:", hist.shape,"bin_edges_shape:", 
bin_edges.shape)

我得到:
('hist shape:',(105,),'bin_edges_shape:',(106,))
如果我看看我们得到的指数:

np.unique(a_binidx)

结果是:
阵列([ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40、41、42、43、44、45、46、47、48、49、50、51、52、53、54、55、56、57、58、59、60、61、62、63、64、65、66、67、68、69、70、71、72、73、74、75、76、78、79、70、71、72、73、74、75、76 77、78、79、80、81、82、83、84、85、86、87、88、89、90、91、92、93、94、95、96、97、99、102、105])
这意味着实际上只有105个箱子。

niknxzdl

niknxzdl2#

我用pandas.cut()解决了这个问题:

a_binidx = pd.cut(a_noise.flatten(), bins=bin_edges, labels=np.arange(hist.shape[0]), include_lowest=True)

相关问题