У меня есть следующий код, используемый для интерполяции данных трехмерного тома.Ускорение интерполяции Python 3D
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))
Этот код занимает около 37 секунд, чтобы выполнить на 512x512x110 объема (около 29 миллионов точек), что приводит к более чем на одну микросекунду на вокселе (что неприемлемо количество времени для меня - то, что больше он использует 4 ядра). Звонок new_volume=interp(points)
занимает около 80% времени продеберации и создания списка почти в течение всего оставшегося времени.
Есть ли простой (или даже более сложный) способ сделать это вычисление быстрее? Или есть ли хорошая библиотека Python, которая обеспечивает быструю интерполяцию? Мой объем и точки меняются при каждом вызове этого продукта.
Я не совсем уверен, что вы правильно выполняете интерполяцию (трудно сказать, не зная, что такое «результат»). Для массива такого размера 37 секунд не слишком странно. Генерация 'points' может быть значительно ускорена, используя' np.c_ [...] 'вместо' list (zip (...)) '. Посмотрите на [griddata] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html), который займет еще больше времени. Если вам нужна более быстрая интерполяция в таком массиве, вам, вероятно, придется закодировать свой код CUDA и ускорить работу в графическом процессоре. –
@Imanol Спасибо за упоминание функции np.c - я попробую это. 'Result [:,:,:, 1]' является сеткой Y, 'result [:,:,:, 0]' является сеткой X и так далее.Что касается реализации GPU - я тоже это сделаю, но все же - более чем на микросекунду для одной интерполяции вокселей с использованием 4 ядер достаточно высоко. Даже ускорение в 3-5 раз было бы потрясающе. – Nefarin
Попробуйте использовать 'scipy.ndimage.map_coordinates', если вы хотите интерполировать на равную сетку. Обертка может быть найдена здесь (https://github.com/syrte/handy/blob/new/interpolate.py) –