我有如下代码用于插值3D体积数据。
这段代码在512x512x110的体积上执行大约需要37秒(约2900万个点),每个体素花费超过1微秒的时间,这对我来说是无法接受的 - 而且它使用了4个核心。调用
有没有简单(或更复杂)的方法可以使这个计算更快?或者有没有提供更快插值方法的好Python库?我的体积和点在每次调用此程序时都会改变。
Y, X, Z = np.shape(volume)
xs = np.arange(0, X)
ys = np.arange(0, Y)
zs = np.arange(0, Z)
points = list(zip(np.ravel(result[:, :, :, 1]), np.ravel(result[:, :, :, 0]), np.ravel(result[:, :, :, 2])))
interp = interpolate.RegularGridInterpolator((ys, xs, zs), volume,
bounds_error=False, fill_value=0, method='linear')
new_volume = interp(points)
new_volume = np.reshape(new_volume, (Y, X, Z))
这段代码在512x512x110的体积上执行大约需要37秒(约2900万个点),每个体素花费超过1微秒的时间,这对我来说是无法接受的 - 而且它使用了4个核心。调用
new_volume=interp(points)
大约占据80%的处理时间,而列表创建则占据了几乎全部剩余的时间。有没有简单(或更复杂)的方法可以使这个计算更快?或者有没有提供更快插值方法的好Python库?我的体积和点在每次调用此程序时都会改变。
result
是什么很难说)。对于这样大小的数组,37秒并不奇怪。通过使用np.c_[ ... ]
而不是list(zip( ... ))
可以大大加快points
生成速度。请查看griddata,它甚至需要更长时间。如果您想在这样的数组中进行更快的插值,可能需要编写自己的CUDA代码并在GPU中加速。 - Imanol Luengoresult[:, :, :, 1]
是 Y 网格,result[:, :, :, 0]
是 X 网格,等等。关于 GPU 实现 - 我也会做这个,但是 - 使用 4 个核进行一个体素插值超过微秒的时间还是有点高。即使能够提高 3-5 倍的速度也将非常棒。 - Nefarinscipy.ndimage.map_coordinates
。可以在这里找到一个封装。 - Syrtis Major