numpy.histogram2d()返回全零的直方图

时间:2019-12-18 02:14:37

标签: python-3.x numpy histogram

我正在尝试重现使用numpy.histogram2d构造2D直方图时遇到的现象,特别是在使用“ bins”参数时。当我对bins参数使用整数时(例如bins = 20),我会看到预期的2D直方图。但是,我希望直方图具有大小一致的容器,因此我想创建带有设置的最小和最大x值和y值的直方图。目前,我正在使用numpy.linspace创建bin分区,以获取均等值的数组。

x_bins = np.linspace(min_range, max_range, num=num_bins+1) #numpy is imported as np
y_bins = np.linspace(0, max_even, num=num_bins+1)

我将这些数组用于numpy.histogram2d中的bins参数。

hist, xedges, yedges = np.histogram2d(x, y, bins=(x_bins, y_bins))

x和y数组是介于min_range和max_range的值之间(对于x),以及介于0和max_even(对于y)之间的数字数组。当我使用数组定义垃圾箱时,我生成的某些直方图全为零。所有x和y数组的长度都是相同的,我唯一能想到的变化就是输入numpy.histogram2d的数字范围。 在这些x和y范围内的数字产生的直方图不全为零:

x:最小范围= 0.07,最大范围= 142.095; y:0,max_even = 471.64

x:最小范围= 0.218,最大范围= 195.178; y:0,max_even = 1493.489

这些范围内的数字会产生全零的直方图:

x:最小范围= 0.006,最大范围= 6.916; y:0,max_even = 1.101

x:最小范围= 0,最大范围= 5.58; y:0,max_even = 1.205

x和y数组都是numpy数组。打印出x和y箱和值表明所有x和y值都应落入已定义的箱中。尝试用感兴趣范围内的随机值数组复制错误未成功,因此,我对缺少示例表示歉意;欢迎提出任何复制建议。是什么导致histogram2d函数返回全零的直方图?

编辑

我尝试使用histogram2d的range参数定义最小和最大x和y值,并对bins参数使用整数(下面的代码)。这对全零的直方图没有影响。

hist, xedges, yedges = np.histogram2d(x, y, bins=10, range=[[min_range, max_range], [0, max_even]])

1 个答案:

答案 0 :(得分:0)

以下是将生成零数组的情况。如果通过轴交换范围参数或重复使用范围参数,则可能会生成带有某些x和y数组的零的二维直方图。

import numpy as np

np.random.seed(100)
x = 5*np.random.rand(40)+5.
y = 3*np.random.rand(40)+10.

x_min = x.min()
x_max = x.max()

y_min = y.min()
y_max = y.max()

np.histogram2d( x , y, bins = [ 5, 3 ], range = [[ x_min, x_max ], [ x_min, x_max ]])
#                                                  x_min & x_max both times!!

# (array([[0., 0., 0.],
#         [0., 0., 0.],
#         [0., 0., 0.],
#         [0., 0., 0.],
#         [0., 0., 0.]]),
#  array([5.02359428, 5.99979628, 6.97599828, 7.95220028, 8.92840228, 9.90460429]),
#  array([5.02359428, 6.65059762, 8.27760095, 9.90460429]))

# Corrected version
np.histogram2d( x , y, bins = [ 5, 3 ], range = [[ x_min, x_max ], [ y_min, y_max ]])

# (array([[5., 5., 2.],
#         [1., 4., 3.],
#         [0., 3., 2.],
#         [2., 0., 1.],
#         [5., 5., 2.]]),
# array([5.02359428, 5.99979628, 6.97599828, 7.95220028, 8.92840228, 9.90460429]),
# array([10.0613174 , 11.01588476, 11.97045212, 12.92501948]))