列表中的哪些元素放入哪些直方图箱中?
问题描述
我正在尝试从直方图绘制比例散点图。散点图相当简单,制作直方图、查找仓位中心、散点图。
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
(与A
和B
长度相同),该列表为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. ])
相关文章