我正在尝试从直方图中制作缩放的散点图。散点图相当简单,制作直方图,找到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?
答案 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);
最后,如果您打算获取分配给分档,那么这正是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. ])