数据来自测量。 plotted data
的图片我尝试过使用trapz两次,但我得到了错误代码:" ValueError:操作数无法与形状(1,255)(256,531)" x有256个点,y有532个点,Z也是2d数组,长度为256乘532。代码如下:
import numpy as np
img=np.loadtxt('focus_x.txt')
m=0
m=np.max(img)
Z=img/m
X=np.loadtxt("pixelx.txt",float)
Y=np.loadtxt("pixely.txt",float)
[X, Y] = np.meshgrid(X, Y)
volume=np.trapz(X,np.trapz(Y,Z))
答案 0 :(得分:0)
The docs声明trapz
应该像这样使用
intermediate = np.trapz(Z, x)
result = np.trapz(intermediate, y)
trapz
正在减少其操作数的维度(默认情况下在最后一个轴上),使用可选一个横坐标数组来确定积分的子间隔;它没有使用网格网格进行操作。
首先,我们使用sympy
计算矩形域(0, 5) × (0, 7)
上的简单双线性函数的积分
In [1]: import sympy as sp, numpy as np
In [2]: x, y = sp.symbols('x y')
In [3]: f = 1 + 2*x + y + x*y
In [4]: f.integrate((x, 0, 5)).integrate((y, 0, 7))
Out[4]: 2555/4
现在我们计算积分的梯形近似值(正好是双线性函数的近似值) - 我们需要坐标数组
In [5]: x, y = np.linspace(0, 5, 11), np.linspace(0, 7, 22)
(请注意,两个方向的采样不同,与trapz
使用的defalt值不同) - 我们需要一个网格来计算被积函数,我们需要计算被积函数
In [6]: X, Y = np.meshgrid(x, y)
In [7]: z = 1 + 2*X + Y + X*Y
最终我们计算积分
In [8]: 4*np.trapz(np.trapz(z, x), y)
Out[8]: 2555.0