计算3d图的体积

时间:2017-11-21 14:09:05

标签: python-3.x numpy

数据来自测量。 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))

1 个答案:

答案 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