Python numpy.histogram2d函数方法的使用

NumPy(Numerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍一下NumPy中histogram2d方法的使用。

numpy.histogram2d

numpy.histogram2d(x, y, bins=10, range=None, normed=None, weights=None, density=None)    [source]

计算两个数据样本的二维直方图。

参数 :

x :array_like, shape (N,)

包含要直方图的点的x坐标的数组。

y :array_like, shape (N,)

包含要直方图的点的y坐标的数组。

bins :int 或 array_like 或 [int, int] 或 [array, array], 可选

bin规格:

1)  如果为int,则为两个维度的bins数(nx = ny = bins)。 

2)  如果为array_like,

则两个维度的bin边缘(x_edges = y_edges = bins)。

3)  如果为[int,int],

则为每个维度中的箱数(nx,ny =bins)。

4)  如果为[array,array],

则每个维度的bin边缘(x_edges,y_edges = bins)。

5)  [int,array]或[array,int]的组合,

其中int是容器的数量,而array是容器的边缘。

range :array_like, shape(2,2), 可选

bins沿每个维度的最左边缘和最右边缘

(如果未在bins参数中明确指定):

[[xmin,xmax],[ymin,ymax]]

 所有超出此范围的值都将被视为离群值,并且不会在直方图中列出。

density :bool, 可选

如果默认值为False,则返回每个bin中的样本数。如果为True,

则在bin处返回概率密度函数bin_count / sample_count / bin_area

normed :bool, 可选

密度参数的别名,其行为相同。

为了避免与histogram的标准化规范混淆,应首选密度。

weights :array_like, shape(N,), 可选

一组值w_i称重每个样本(x_i,y_i)。 

如果标准为True,则将权重标准化为1。

 如果normed为False,

则返回的直方图的值等于属于每个bin的样本的权重之和。

返回值 :

H :ndarray, shape(nx, ny)

样本x和y的二维直方图。 x中的值沿第一维直方图,y中的值沿第二维直方图。

xedges :ndarray, shape(nx+1,)

垃圾箱沿第一维边缘。

yedges :ndarray, shape(ny+1,)

垃圾箱沿第二维边缘。

Notes

当normed为True时,返回的直方图就是样本密度,定义为使得产品bin_value * bin_area的bin上的总和为1。

请注意,直方图不遵循笛卡尔约定,其中x值在横坐标上,y值在纵坐标上。相反,x沿数组的第一维(垂直)直方图,y沿数组的第二维(水平)直方图。这样可以确保与histogramdd兼容。

例子

>>> from matplotlib.image import NonUniformImage
>>> import matplotlib.pyplot as plt

构造具有可变bin宽的二维直方图。首先定义bin边缘:

>>> xedges = [0, 1, 3, 5]
>>> yedges = [0, 2, 3, 4, 6]

接下来,我们创建具有随机bin内容的直方图H:

>>> x = np.random.normal(2, 1, 100)
>>> y = np.random.normal(1, 1, 100)
>>> H, xedges, yedges = np.histogram2d(x, y, bins=(xedges, yedges))
>>> H = H.T  # Let each row list bins with common y range.

imshow只能显示方形bins:

>>> fig = plt.figure(figsize=(7, 3))
>>> ax = fig.add_subplot(131, title='imshow: square bins')
>>> plt.imshow(H, interpolation='nearest', origin='low',
...         extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])
<matplotlib.image.AxesImage object at 0x...>

pcolormesh可以显示实际边缘:

>>> ax = fig.add_subplot(132, title='pcolormesh: actual edges',
...         aspect='equal')
>>> X, Y = np.meshgrid(xedges, yedges)
>>> ax.pcolormesh(X, Y, H)
<matplotlib.collections.QuadMesh object at 0x...>

NonUniformImage可用于显示具有插值的实际bin边缘:

>>> ax = fig.add_subplot(133, title='NonUniformImage: interpolated',
...         aspect='equal', xlim=xedges[[0, -1]], ylim=yedges[[0, -1]])
>>> im = NonUniformImage(ax, interpolation='bilinear')
>>> xcenters = (xedges[:-1] + xedges[1:]) / 2
>>> ycenters = (yedges[:-1] + yedges[1:]) / 2
>>> im.set_data(xcenters, ycenters, H)
>>> ax.images.append(im)
>>> plt.show()


推荐阅读
cjavapy编程之路首页