哪个列表元素进入哪个直方图箱?

时间:2016-02-21 22:07:34

标签: python numpy histogram

我正在尝试从直方图中制作缩放的散点图。散点图相当简单,制作直方图,找到bin中心,散点图。

nbins=7
# Some example data
A = np.random.randint(0, 10, 100) 
B = np.random.rand(100)

counts, binEdges=np.histogram(A,bins=nbins)
bincenters = 0.5*(binEdges[1:]+binEdges[:-1])

fig = plt.figure(figsize=(7,5))
ax = fig.add_subplot(111)
ax.scatter(bincenters,counts,c='k', marker='.')
ax_setup(ax, 'X', 'Y')
plt.show()

但我希望A的每个元素只为其bin提供一个缩放值,该缩放值存储在B中。 (即,不是每个bin都是来自A的bin的元素数,我希望每个bin都是来自B的对应值的总和)

为此,我尝试创建一个列表C(与A相同的长度,B),为A的每个元素分配了bin号,然后将来自B的所有值汇总到同一个bin中。我认为numpy.searchsorted()就是我所需要的,例如,

C = bincenters.searchsorted(A, 'right')

但是这不能正确分配,并且似乎没有返回正确数量的分档。

那么,如何创建一个列表,告诉我数据的每个元素都进入哪个直方图bin?

1 个答案:

答案 0 :(得分:2)

你写

  

但是我希望A的每个元素只为它的bin提供一个缩放值,该缩放值存储在B中。(即不是每个bin是该bin中A的元素计数,我希望每个bin都是是来自B)

的相应值的总和

IIUC,numpy.histogram已通过weights参数支持此功能:

  

一系列重量,形状与a相同。 a中的每个值仅将其相关权重贡献给bin计数(而不是1)。如果normed为True,则权重被归一化,因此密度在整个范围内的积分保持为1。

所以,对于你的情况,它只是

counts, binEdges=np.histogram(A, bins=nbins, weights=B)

另一点:如果你的意图是绘制直方图,请注意你可以直接使用matplotlib.pyplot的效用函数(也需要weights):

from matplotlib import pyplot as plt
plt.hist(A, bins=nbins, weights=B);

enter image description here

最后,如果您打算获取分配给分档,那么这正是numpy.digitize所做的:

nbins=7
# Some example data
A = np.random.randint(0, 10, 10) 
B = np.random.rand(10)

counts, binEdges=np.histogram(A,bins=nbins)
>>> binEdges, np.digitize(A, binEdges)
array([ 0.        ,  1.28571429,  2.57142857,  3.85714286,  5.14285714,
    6.42857143,  7.71428571,  9.        ])