我的目标是为图像的每个像素(在我的例子中是一个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?
2条答案
按热度按时间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。
举例来说:
我得到:
('hist shape:',(105,),'bin_edges_shape:',(106,))
如果我看看我们得到的指数:
结果是:
阵列([ 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个箱子。
niknxzdl2#
我用
pandas.cut()
解决了这个问题: