列表中的哪些元素放入哪些直方图箱中?

2022-03-15 00:00:00 python numpy histogram

问题描述

我正在尝试从直方图绘制比例散点图。散点图相当简单,制作直方图、查找仓位中心、散点图。

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的每个元素只向其绑定贡献一个缩放值,该缩放值存储在B中。(即,我希望每个bin不是该bin的A中的元素计数,而是B中的相应值之和)

为此,我尝试创建一个列表C(与AB长度相同),该列表为A的每个元素分配仓号,然后将B中的所有值相加到同一仓位。我想numpy.searchsorted()就是我需要的,例如

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

但是这没有正确分配,并且似乎没有返回正确的箱数。

那么,我如何创建一个列表来告诉我每个数据元素都属于哪个直方图框?


解决方案

您写的

但我希望A的每个元素只向其bin贡献一个缩放值,该缩放值存储在B中(即,不是每个bin是该bin的A的元素计数,而是希望每个bin是B的相应值的总和)

IIUC,numpy.histogram中已通过weights参数:

支持此功能
与a形状相同的权重数组。a中的每个值仅将其关联的权重贡献给仓位计数(而不是1)。如果Normded为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);


最后,如果您打算将作业放到垃圾箱中,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.        ])

相关文章