Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用Pylab创建Python直方图_Python_Matplotlib_Histogram_Gaussian - Fatal编程技术网

不使用Pylab创建Python直方图

不使用Pylab创建Python直方图,python,matplotlib,histogram,gaussian,Python,Matplotlib,Histogram,Gaussian,我必须生成一个高斯分布的随机数列表(我能做到这一点),然后将这些数字绘制成直方图。我的问题是,我应该这样做,而不使用pylab(或任何其他软件包)中的内置直方图函数,我完全不知所措。我一直在网上寻找,但我没有找到任何解释我将如何处理这件事的方法,你们知道我能做什么吗?提前感谢。假设您有一个表示随机数的numpy数组 rnd_numb=array([ 0.48942231, 0.48536864, 0.48614467, ..., 0.47264172, 0.4830

我必须生成一个高斯分布的随机数列表(我能做到这一点),然后将这些数字绘制成直方图。我的问题是,我应该这样做,而不使用pylab(或任何其他软件包)中的内置直方图函数,我完全不知所措。我一直在网上寻找,但我没有找到任何解释我将如何处理这件事的方法,你们知道我能做什么吗?提前感谢。

假设您有一个表示随机数的
numpy
数组

        rnd_numb=array([ 0.48942231,  0.48536864,  0.48614467, ...,  0.47264172,
    0.48309697,  0.48439782])
为了创建直方图,您只需要对数据进行分类。因此,让我们创建一个数组来定义装箱

       bin_array=linspace(0,1,100)
在本例中,我们将在0到1的范围内创建100个线性间隔的容器

现在,为了创建直方图,您只需执行以下操作

  my_histogram=[]
  for i in range(len(bin_array)-1):
     mask = (rnd_numb>=bin_array[i])&(rnd_numb<bin_array[i+1])
     my_histogram.append(len(rnd_numb[mask]))

您也可以尝试
step
bar

让我们假设您有一个
numpy
数组来表示您的随机数

        rnd_numb=array([ 0.48942231,  0.48536864,  0.48614467, ...,  0.47264172,
    0.48309697,  0.48439782])
为了创建直方图,您只需要对数据进行分类。因此,让我们创建一个数组来定义装箱

       bin_array=linspace(0,1,100)
在本例中,我们将在0到1的范围内创建100个线性间隔的容器

现在,为了创建直方图,您只需执行以下操作

  my_histogram=[]
  for i in range(len(bin_array)-1):
     mask = (rnd_numb>=bin_array[i])&(rnd_numb<bin_array[i+1])
     my_histogram.append(len(rnd_numb[mask]))

您也可以尝试
step
bar

计算直方图的一种快速方法是一次遍历列表中的一个元素,排序它应该在哪个箱子中,然后计算每个箱子中的条目数

hist_vals = np.zeros(nbins)
for d in data:
    bin_number = int(nbins * ((d - min_val) / (max_val - min_val)))
    hist_vals[bin_number] += 1
注意,这有一个带有小预因子的O(len(data))

写这篇文章的一个更聪明的方法是将哈希函数矢量化:

bin_number = (nbins * ((data - min_val) / (max_val - min_val))).astype(np.int)
并使用切片魔法求和:

hist_vals[bin_number] += 1  # numpy slicing magic
如果您关心速度,您可以使用numpy函数来实现这一点,但将循环置于c级别:

bin_nums = np.digitize(data, bins) - 1
hist_vals = np.bincount(bin_nums)

计算直方图的一种快速方法是一次遍历列表中的一个元素,排序它应该在哪个容器中,然后计算每个容器中的条目数

hist_vals = np.zeros(nbins)
for d in data:
    bin_number = int(nbins * ((d - min_val) / (max_val - min_val)))
    hist_vals[bin_number] += 1
注意,这有一个带有小预因子的O(len(data))

写这篇文章的一个更聪明的方法是将哈希函数矢量化:

bin_number = (nbins * ((data - min_val) / (max_val - min_val))).astype(np.int)
并使用切片魔法求和:

hist_vals[bin_number] += 1  # numpy slicing magic
如果您关心速度,您可以使用numpy函数来实现这一点,但将循环置于c级别:

bin_nums = np.digitize(data, bins) - 1
hist_vals = np.bincount(bin_nums)

这是一个基于@tacaswell解决方案的版本,但不使用numpy

def histogram(data, nbins, min_val=None, max_val=None):
    hist_vals = [0]*(nbins+1)
    if min_val is None:
        min_val = min(data)
    if max_val is None:
        max_val = max(data)

    for d in data:
        bin_number = int(nbins * ((d - min_val) / (max_val - min_val)))
        hist_vals[bin_number] += 1
    bin_lower_bounds = [min_val + i*(max_val - min_val)/len(hist_vals) for i in range(len(hist_vals))]
    return hist_vals, bin_lower_bounds

这是一个基于@tacaswell解决方案的版本,但不使用numpy

def histogram(data, nbins, min_val=None, max_val=None):
    hist_vals = [0]*(nbins+1)
    if min_val is None:
        min_val = min(data)
    if max_val is None:
        max_val = max(data)

    for d in data:
        bin_number = int(nbins * ((d - min_val) / (max_val - min_val)))
        hist_vals[bin_number] += 1
    bin_lower_bounds = [min_val + i*(max_val - min_val)/len(hist_vals) for i in range(len(hist_vals))]
    return hist_vals, bin_lower_bounds

把你的值拼成方块,然后用星号打印出每个桶中的物品数量,怎么样?例如:
对于bucket中的bucket:打印“*”*bucket
。这将为您提供一个水平显示条形图的图形表示。中的几个答案不使用任何直方图模块。将您的值拼成方块,然后用星号打印出每个方块中的项目数如何?例如:
对于bucket中的bucket:打印“*”*bucket
。这将为您提供一个水平显示条的图形表示。中的几个答案不使用任何直方图模块。这对我来说非常有效。谢谢你的帮助!当您多次触摸数据数组的每个元素(>nbins*2)时,这将严重影响扩展。你可以在一次通过数据的过程中计算出直方图,这对我来说非常有效。谢谢你的帮助!当您多次触摸数据数组的每个元素(>nbins*2)时,这将严重影响扩展。如果数据集很小,则可以通过一次数据传递计算直方图。如果您处理的是一个大样本(N>1e6),那么我提出的解决方案的规模要大得多。@Matteo您是否已经对此进行了基准测试?这应该可以更好地扩展,但可能会因为使用python而不是c进行循环而变得更慢(c中错误的算法可能比python中正确的算法更快)。我习惯于处理大量数据(N>1e8),我可以告诉您,如果使用我建议的代码,我只需要等待几分钟(最多)就可以得到答案。虽然您的方法对于小数据集或当存储箱数量很大时非常聪明和有用,但可能需要几天的时间。我刚刚在1e8数据点上运行了它,纯python版本大约需要一分钟,而
np.bincount(np.digitize(np.random.rand(1e8),np.linspace(0,1100,endpoint=True),right=True)则需要<6秒)-1)
@tcaswell:我想知道是否应该将
hist\u vals=np.zeros(nbins)
更改为
hist\u vals=np.zeros(nbins+1)
!如果数据集很小,这可能会起作用。如果您处理的是一个大样本(N>1e6),那么我提出的解决方案的规模要大得多。@Matteo您是否已经对此进行了基准测试?这应该可以更好地扩展,但可能会因为使用python而不是c进行循环而变得更慢(c中错误的算法可能比python中正确的算法更快)。我习惯于处理大量数据(N>1e8),我可以告诉您,如果使用我建议的代码,我只需要等待几分钟(最多)就可以得到答案。虽然您的方法对于小数据集或当存储箱数量很大时非常聪明和有用,但可能需要几天的时间。我刚刚在1e8数据点上运行了它,纯python版本大约需要一分钟,而
np.bincount(np.digitize(np.random.rand(1e8),np.linspace(0,1100,endpoint=True),right=True)则需要<6秒)-1)
@tcaswell:我想知道是否应该将
hist\u vals=np.zeros(nbins)
更改为
hist\u vals=np.zeros(nbins+1)