Scipy中的3d插值 - 密度网格

时间:2011-06-15 14:52:58

标签: 3d grid scipy interpolation

我有一组坐标表示许多物体的三维位置。这些点来自三维立方体的模拟。我需要做的是在立方体上制作一个三维网格,然后将这些点分配到网格上正确的位置,这样我就可以在网格的每个部分找到对象的密度。我一直在搜索插值和网格文档(例如http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html#scipy.interpolate.griddata),但我不确定该怎么做,因为我没有与这些数据点相关的功能。我想要做的是使用if语句:给定一个点数组= [x1,y1,z1],[x2,y2,z2]等,如果points [i] [0] -gridpoint1 [0]&lt ; 1:if points [i] [1] -gridpoint1 [1]< 1:if points [i] [2] -gridpoint1 [2]< 1,points [i] = bin1 [i],其中bin1将是一个预制的零数组。但是,我想我必须为网格上的每个网格点运行它(网格点将位于每个bin的中心),然后计算每个bin中有多少非零元素,我就是也不知道该怎么做。我有一种感觉,我可以在scipy中使用某种功能来更轻松地完成这项任务,但我仍然不确定如何到达那里。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

如果我理解正确,你有坐标(x [i],y [i],z [i]),i = 0,...,N-1,你想要计算它们中有多少个结束在3D立方体中的给定网格单元中?

可以使用numpy.histogramdd

来完成
import numpy as np

# some random points in a cube
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100);

# specify grid in a cube
xgrid = np.linspace(0.0, 1.0, 5)
ygrid = np.linspace(0.0, 1.0, 6)
zgrid = np.linspace(0.0, 1.0, 7)

# compute counts
counts, edges = np.histogramdd(np.c_[x, y, z], bins=(xgrid, ygrid, zgrid))

print counts.shape # -> (4, 5, 6)

# number of points in the box 
# xgrid[1] <= x < xgrid[2] && ygrid[2] <= y < ygrid[3] && zgrid[0] <= z < zgrid[1]
print counts[1, 2, 0]

如果您想找出每个点所在的网格单元格,可以使用searchsorted来完成:

ix = np.searchsorted(xgrid, x) - 1
iy = np.searchsorted(ygrid, y) - 1
iz = np.searchsorted(zgrid, z) - 1

# point (x[3], y[3], z[3]) is in the following grid cell
print ix[3], iy[3], iz[3]