gpt4 book ai didi

python - Numpy.histogram 连接 bin

转载 作者:行者123 更新时间:2023-11-30 23:00:18 26 4
gpt4 key购买 nike

我有一些图像数据,我使用 numpy 在直方图中绘制了这些数据,如下面的代码所示。我遇到的问题是,x 轴以 1 为步长上升,但 bin 宽度约为 1.3(我通过放大并查看 bin 宽度粗略计算得出)。

这会产生一个如下所示的直方图:

enter image description here

正如您所看到的,在某些点,直方图下降到零。如果我放大,值为 0 的点不是整数。因为我的数据是整数,所以数字 550.8 显然会出现 0 次,这导致直方图具有上面的外观(我认为)。

如果我将垃圾箱的数量从 100 增加到 1000,我就可以解决这个问题。这给我留下了下面的直方图:

enter image description here

所以我终于回答了我的问题(对长篇文章表示歉意!)...有没有办法使用 np.histogram 加入垃圾箱(当像我一样使用大量数据来解决我的初始问题时)。我想这只是为了美观,不是必需的,但看起来会更好。

我还看过这里的其他帖子,但几乎所有帖子都使用 plt.hist 作为直方图,而不是 np.histogram

我的代码:

def histo():

heights,edges = np.histogram(data, bins=100, range=(minvalue,maxvalue))
edges = edges[:-1]+(edges[1]-edges[0]) ### not entirely sure what this line is actually doing

fig, ax = plt.subplots()
ax.plot(edges,heights)

ax.set(title=title, xlabel='ADC Value(DN/40)', ylabel='Frequency')

#do some analysis of the data between two clicks

point1, point2 = fig.ginput(2)
ax.axvspan(point1[0], point2[0], color='blue', alpha=0.5)
mask = (edges>point1[0]) & (edges<point2[0])

## more analysis code ##


data = someimage_data

histo()

最佳答案

正如您自己怀疑的那样,问题是您的整数数据需要定制适合的箱才能获得漂亮的直方图。事实上,对于直方图来说通常都是如此。

考虑对您的问题进行以下重构:

import numpy as np

# generate data
data = np.floor(np.random.randn(10000)*20+620)
data = dat[(560<dat) & (dat<650)]

# do what you're doing
heights,edges = np.histogram(data, bins=100, range=(data.min(),data.max()))
edges = edges[:-1]+(edges[1]-edges[0]) # shift first x coordinate to edges[1]
# and drop last point: 1 more edge than bins

fig, ax = plt.subplots()
ax.plot(edges,heights)

结果非常丑陋:

before

问题是您使用了 100 个垃圾箱,但您的整数值在 560 到 650 之间:这意味着一些垃圾箱肯定是空的!

一个简单的解决方案是设置比可能的唯一整数值​​的数量稍小的 bin 计数:

# do what you're doing
range = [data.min(),data.max()]
heights,edges = np.histogram(data, bins=np.ceil((range[1]-range[0])*0.95), range=range)
edges = edges[:-1]+(edges[1]-edges[0]) # shift first x coordinate to edges[1]

fig, ax = plt.subplots()
ax.plot(edges,heights)

情况越来越好:

better

但很明显,一些 bin 包含多个整数,而其他 bin 则不包含,这一事实显然存在伪影。这是原始问题的一个不那么令人震惊的例子。

最终的解决方案是针对您的问题使用定制的 bin:对 bin 使用 array_like 变量,每个 bin 包含一个整数。我建议使用 np.arange(),向下移动 0.5:

# do what you're doing
range = [data.min(),data.max()]
bins = np.arange(range[0],range[1]+2) - 0.5
heights,edges = np.histogram(data, bins=bins, range=range)
edges = edges[:-1]+(edges[1]-edges[0]) # shift first x coordinate to edges[1]

fig, ax = plt.subplots()
ax.plot(edges,heights)

而且它非常漂亮!

best

关于python - Numpy.histogram 连接 bin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35347515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com