2012-01-09 47 views
5

我有一个大型的网格数据点,我已经从模拟产生了,并且与xy平面中的每个点相关联的是z值(模拟结果)。由数据点定义的“平面”下的体积-python

我将x,y,z值转储为纯文本文件,我想要做的是测量xy平面(即z = 0)和由数据点。数据点目前并不是均匀间隔的,尽管它们应该在模拟运行完成之后。

我一直在寻找scipy文档,我不确定scipy.integrate是否提供了我需要的功能 - 似乎只有在2d中才能做到这一点,而不是我需要的功能。首先,除非有必要,我可以在没有内插的情况下完全基于“梯形法则”或类似的近似来进行积分,这是一个很好的基础。

任何帮助表示赞赏。

感谢

编辑:双双跌破工作描述以及解决方案。就我而言,事实证明使用样条可能会在飞机的尖锐最大值周围产生“涟漪”,因此Delaunay方法效果更好,但我建议人们检查两者。

回答

3

如果要严格坚持梯形规则,你可以做一些与此类似:

import numpy as np 
import scipy.spatial 

def main(): 
    xyz = np.random.random((100, 3)) 
    area_underneath = trapezoidal_area(xyz) 
    print area_underneath 

def trapezoidal_area(xyz): 
    """Calculate volume under a surface defined by irregularly spaced points 
    using delaunay triangulation. "x,y,z" is a <numpoints x 3> shaped ndarray.""" 
    d = scipy.spatial.Delaunay(xyz[:,:2]) 
    tri = xyz[d.vertices] 

    a = tri[:,0,:2] - tri[:,1,:2] 
    b = tri[:,0,:2] - tri[:,2,:2] 
    proj_area = np.cross(a, b).sum(axis=-1) 
    zavg = tri[:,:,2].sum(axis=1) 
    vol = zavg * np.abs(proj_area)/6.0 
    return vol.sum() 

main() 

无论花键或线性(trapezodial)插值是一个更适合将在很大程度上取决于你的问题。

+0

谢谢,我也会看看这个选择。 – samb8s 2012-01-10 17:05:47