【问题标题】:Which elements of list go into which histogram bins?列表的哪些元素进入哪些直方图箱?
【发布时间】:2016-02-21 22:07:34
【问题描述】:

我正在尝试根据直方图制作比例散点图。散点图相当简单,制作直方图,找到 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 是来自 B 的相应值的总和)

为此,我尝试创建一个列表C(与AB 的长度相同),为A 的每个元素分配bin 编号,然后将@987654330 中的所有值相加@ 进入同一个垃圾箱。我认为numpy.searchsorted() 是我需要的,例如,

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

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

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

【问题讨论】:

    标签: python numpy histogram


    【解决方案1】:

    你写

    但我希望 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.        ])
    

    【讨论】:

    • 非常感谢!这看起来像是根据需要缩放值的技巧(也非常简单)。我想更多的是好奇,知道如何返回 bin 分配列表吗?它可能会在某个时候派上用场。
    • 谢谢阿米,这太完美了。
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2019-08-27
    • 2015-01-27
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多