我有一个(标准化的)2D数据数组 - 假设自变量是x和theta,数据是Data。 (数据实际上是一个后验分布,但只是存储为一个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,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