python:二维分布的积分一阶矩

python:二维分布的积分一阶矩,python,arrays,numpy,statistics,numerical-integration,Python,Arrays,Numpy,Statistics,Numerical Integration,我有一个(标准化的)2D数据数组——假设自变量是x和θ,数据就是数据。(数据实际上是后验分布,但只是存储为一个numpy数组。)我需要在每个维度上取一阶矩,也就是说,我需要计算二重积分 我认为我可以将其实现为,例如: firstint = np.trapz(x*Data, dx=dx, axis=1) a = np.trapz(firstint, dx=dy) 其中dx=x[1]-x[0]和dy=y[1]-y[0](x和y都是均匀间隔数据的1d数组) 但这似乎不起作用——例如,当我用二维高斯

我有一个(标准化的)2D数据数组——假设自变量是x和θ,数据就是数据。(数据实际上是后验分布,但只是存储为一个numpy数组。)我需要在每个维度上取一阶矩,也就是说,我需要计算二重积分

我认为我可以将其实现为,例如:

firstint = np.trapz(x*Data, dx=dx, axis=1)
a = np.trapz(firstint, dx=dy)
其中
dx=x[1]-x[0]
dy=y[1]-y[0]
(x和y都是均匀间隔数据的1d数组)

但这似乎不起作用——例如,当我用二维高斯函数测试它时,我希望得到高斯函数达到峰值的(x,y)值,但我没有

谁能给我指出正确的方向吗?我做错了什么

编辑:这是一个MWE,输出如下。请注意,其中一个尺寸(b积分)工作正常。当我设置xmeas=0.5时,a积分只给出预期的答案。我只是没有正确地正常化,还是因为其他原因而期望得到错误的答案

from __future__ import division, print_function
import numpy as np

sample_x = np.linspace(0, 1, 100)
sample_y = np.linspace(0, np.pi, 100)

y_dx = sample_y[1] - sample_y[0]
x_dx = sample_x[1] - sample_x[0]

yarr = sample_y[:, np.newaxis]
xarr = sample_x

# pick some values
ymeas = np.pi/6
xmeas = 0.1

fwhm = 0.3

# construct 2D gaussian
gaussian = np.exp(-4*np.log(2) * ((xarr-xmeas)**2 + (yarr-ymeas)**2) / fwhm**2)

integrated_over_y = np.trapz(gaussian, dx = y_dx, axis = 1)
integrated_over_x_and_y = np.trapz(integrated_over_y, dx = x_dx)

normed_gaussian = gaussian/integrated_over_x_and_y

# y moment
aintegrand = np.trapz(normed_gaussian*sample_x, axis=1, dx=x_dx)
a = np.trapz(aintegrand, dx=y_dx)

print("expected {}, got {}".format(xmeas, a))

# x moment
bintegrand = np.trapz(normed_gaussian*sample_y[:, np.newaxis], axis=1, dx=x_dx)
b = np.trapz(bintegrand, dx=y_dx)

print("expected {}, got {}".format(ymeas, b))
输出:

>> a: expected 0.1, got 0.147652018282
>> b: expected 0.523598775598, got 0.523610579349

你能提供你正在使用的完整测试吗?看起来不错me@Eric增加了一个MWE。高斯分布的平均值会在它的中心,当然。但你不是在用高斯函数——你是在用高斯函数的矩形切割。边界距离值0越远,平均值与高斯曲线中心对齐的距离就越小。您的代码是正确的,但是您对应该发生的事情的期望是错误的,当然,谢谢。