我有一组坐标表示许多物体的三维位置。这些点来自三维立方体的模拟。我需要做的是在立方体上制作一个三维网格,然后将这些点分配到网格上正确的位置,这样我就可以在网格的每个部分找到对象的密度。我一直在搜索插值和网格文档(例如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中使用某种功能来更轻松地完成这项任务,但我仍然不确定如何到达那里。非常感谢您的帮助!
答案 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]