我有一组数据值,用于标量3D函数,按照输入 x,y,z
的顺序排列在形如 (n,3)
的数组中,并且函数值 f(x,y,z)
排列在形如 (n,)
的数组中。
编辑:例如,考虑以下简单函数
data = np.array([np.arange(n)]*3).T
F = np.linalg.norm(data,axis=1)**2
我希望使用球形卷积核来对此函数进行卷积,以执行3D平滑。我发现最简单的方法是将函数值映射到一个3D空间网格中,然后使用我想要的卷积核进行3D卷积。
这种方法可以正常工作,但是将3D函数映射到3D网格的部分非常缓慢,因为我没有找到仅使用NumPy完成它的方法。下面的代码是我的实际实现,其中data
是包含函数在其中评估的3D位置的(n,3)
数组,F
是包含函数相应值的(n,)
数组,而M
则是包含3D空间网格的(N,N,N)
数组。
step = 0.1
# Create meshgrid
xmin = data[:,0].min()
xmax = data[:,0].max()
ymin = data[:,1].min()
ymax = data[:,1].max()
zmin = data[:,2].min()
zmax = data[:,2].max()
x = np.linspace(xmin,xmax,int((xmax-xmin)/step)+1)
y = np.linspace(ymin,ymax,int((ymax-ymin)/step)+1)
z = np.linspace(zmin,zmax,int((zmax-zmin)/step)+1)
# Build image
M = np.zeros((len(x),len(y),len(z)))
for l in range(len(data)):
for i in range(len(x)-1):
if x[i] < data[l,0] < x[i+1]:
for j in range(len(y)-1):
if y[j] < data[l,1] < y[j+1]:
for k in range(len(z)-1):
if z[k] < data[l,2] < z[k+1]:
M[i,j,k] = F[l]
有没有更有效的方法将3D函数的值填充到3D空间网格中?
np.meshgrid
来创建3D网格吗? - Ulises Bussiif
语句将使执行“整个数组”操作变得困难。它们本质上是标量。 - hpauljif
条件的动机吗? - amzon-ex