【发布时间】:2021-12-27 17:56:20
【问题描述】:
我有一组标量 3D 函数的数据值,它们排列为形状为 (n,3) 的数组中的输入 x,y,z 和形状为 (n,) 的数组中的函数值 f(x,y,z)。
编辑:例如,考虑以下简单函数
data = np.array([np.arange(n)]*3).T
F = np.linalg.norm(data,axis=1)**2
我想将此函数与球核进行卷积,以执行 3D 平滑。我发现执行此操作的最简单方法是将函数值映射到 3D 空间网格中,然后使用我想要的内核应用 3D 卷积。
这很好用,但是将 3D 函数映射到 3D 网格的部分非常慢,因为我没有找到仅使用 NumPy 的方法。下面的代码是我的实际实现,其中data 是(n,3) 数组,其中包含函数被评估的3D 位置,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创建de 3D网格? -
“3D 功能”在哪里?所有这些
if将使执行“整个数组”操作变得困难。这些本质上是标量。 -
我已经更新了我的问题,希望现在可以解决。 “3D 函数”是指以 3D 向量作为输入的标量函数。
-
请注意,由于条件:
The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(),当前代码不起作用。 -
@JérômeRichard 此代码在我的机器上执行没有问题(刚刚测试过)。
标签: python numpy performance