在Python中返回给定x和y的2D PDF的值?

时间:2015-07-15 12:27:39

标签: python pdf indexing histogram

我有一些数据,我使用matplotlib的hist2D函数绘制了PDF。 结果如下:

enter image description here

hist2d函数返回三个数组:H,xedges,yedges。 H是2D直方图值。 现在我想转动这个离散的H矩阵并将其转换为一个函数,它返回任何给定(x,y)输入的H值。 换句话说,我想将我的2D直方图转换为2D阶梯函数。是否有一个特定的功能在计算上便宜,我可以用于此目的?

这看起来像一个非常简单的操作(通常用于图像处理但是使用像素索引而不是实数)但是我找不到任何关于它的信息,你能帮助我吗?

1 个答案:

答案 0 :(得分:1)

您可以根据以下计数构建插补器:

from numpy import random, histogram2d, diff
import matplotlib.pyplot as plt
from scipy.interpolate import interp2d

# Generate sample data
n = 10000
x = random.randn(n)
y = -x + random.randn(n)

# bin
nbins = 100
H, xedges, yedges = histogram2d(x, y, bins=nbins)

# Figure out centers of bins
def centers(edges):
    return edges[:-1] + diff(edges[:2])/2

xcenters = centers(xedges)
ycenters = centers(yedges)

# Construct interpolator
pdf = interp2d(xcenters, ycenters, H)

# test
plt.pcolor(xedges, yedges, pdf(xedges, yedges))

结果:

result of interpolation

请注意,这将是线性插值而不是逐步插值。对于采用常规网格的更快版本,这也适用:

from numpy import meshgrid, vectorize

def position(edges, value):
    return int((value - edges[0])/diff(edges[:2]))

@vectorize
def pdf2(x, y):
    return H[position(yedges, y), position(xedges, x)]

# test - note we need the meshgrid here to get the right shapes
xx, yy = meshgrid(xcenters, ycenters)
plt.pcolor(xedges, yedges, pdf2(xx, yy))