gpt4 book ai didi

python - 带有表示频率的单独列表的直方图

转载 作者:太空宇宙 更新时间:2023-11-04 01:24:24 25 4
gpt4 key购买 nike

假设我有两个列表:

    x1 = [1,2,3,4,5,6,7,8,1,10]
x2 = [2,4,2,1,1,1,1,1,2,1]

这里,列表的每个索引i是一个时间点,x2[i]表示比x1[ i] was observed 在时间 i 被观察到。还要注意 x1[0] = 1 和 x1[8] = 1,总频率为 4 (= x2[0] + x2[8])。

如何有效地将其转换为直方图?下面是简单的方法,但这可能效率低下(创建第三个对象并循环)并且会伤害我,因为我有巨大的数据。

import numpy as np
import matplotlib.pyplot as plt

x3 = []
for i in range(10):
for j in range(x2[i]):
x3.append(i)

hist, bins = np.histogram(x1,bins = 10)
width = 0.7*(bins[1]-bins[0])
center = (bins[:-1]+bins[1:])/2
plt.bar(center, hist, align = 'center', width = width)
plt.show()

最佳答案

最好的方法是在 np.histogram (doc) 上使用 weights kwarg ,它还将处理 x1

中的任意 bin 大小和非整数值
vals, bins = np.histogram(x1, bins=10, weights=x2)

如果您只需要基于整数值进行累加,您可以一次性创建直方图:

new_array = np.zeros(x2.shape)  # or use a list, but I like numpy and you have it
for ind, w in izip(x1, x2):
# -1 because your events seem to start at 1, not 0
new_array[ind-1] += w

如果你真的想用列表来做到这一点,你可以使用列表理解

[_x for val, w in zip(x1, x2) for _x in [val]*w]

返回

[1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 1, 1, 10]

作为旁注,了解如何有效地手动计算直方图是值得的:

from __future__ import division
from itertools import izip

num_new_bins = 5
new_min = 0
new_max = 10
re_binned = np.zeros(num_new_bins)
for v, w in izip(x1, x2):
# figure out what new bin the value should go into
ind = int(num_new_bins * (v - new_min) / new_max)
# make sure the value really falls into the new range
if ind < 0 or ind >= num_new_bins:
# over flow
pass
# add the weighting to the proper bin
re_binned[ind] += w

关于python - 带有表示频率的单独列表的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19001167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com