Я написал процедуру, которая интерполирует данные точки на регулярную сетку. Тем не менее, я считаю, что реализация scipy
«s ближайшего соседа интерполяции выполняет почти в два раза медленнее радиальной базисной функции я использую для линейной интерполяции (scipy.interpolate.Rbf
)Почему линейная интерполяция Scipy работает быстрее, чем интерполяция ближайшего соседа?
Соответствующий код включает в себя, как будут построены интерполяторы
if interpolation_mode == 'linear':
interpolator = scipy.interpolate.Rbf(
point_array[:, 0], point_array[:, 1], value_array,
function='linear', smooth=.01)
elif interpolation_mode == 'nearest':
interpolator = scipy.interpolate.NearestNDInterpolator(
point_array, value_array)
и когда интерполяция называется
result = interpolator(col_coords.ravel(), row_coords.ravel())
Пробу Я бегу на 27 имеет входные точки интерполянт значение, и я интерполирования через почти 20000 X 20000 сетки. (Я делаю это в размерах блока памяти, поэтому я не взламываю компьютер. Кстати,
Ниже приведены два результата: cProfile
s Я выполнил соответствующий код. Обратите внимание, что схема ближайшего соседа работает за 406 секунд, а линейная схема работает через 256 секунд. В ближайшей схеме преобладают вызовы scipy's kdTree
, что кажется разумным, за исключением того, что rbf
превосходит его на значительное количество времени. Любые идеи, почему или что я могу сделать, чтобы моя ближайшая схема работала быстрее, чем линейная?
Линейный пробег:
25362 function calls in 225.886 seconds
Ordered by: internal time
List reduced from 328 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
253 169.302 0.669 207.516 0.820 C:\Python27\lib\site-packages\scipy\interpolate\rbf.py:112(
_euclidean_norm)
258 38.211 0.148 38.211 0.148 {method 'reduce' of 'numpy.ufunc' objects}
252 6.069 0.024 6.069 0.024 {numpy.core._dotblas.dot}
1 5.077 5.077 225.332 225.332 C:\Python27\lib\site-packages\pygeoprocessing-0.3.0a8.post2
8+n5b1ee2de0d07-py2.7-win32.egg\pygeoprocessing\geoprocessing.py:333(interpolate_points_uri)
252 1.849 0.007 2.137 0.008 C:\Python27\lib\site-packages\numpy\lib\function_base.py:32
85(meshgrid)
507 1.419 0.003 1.419 0.003 {method 'flatten' of 'numpy.ndarray' objects}
1268 1.368 0.001 1.368 0.001 {numpy.core.multiarray.array}
252 1.018 0.004 1.018 0.004 {_gdal_array.BandRasterIONumPy}
1 0.533 0.533 225.886 225.886 pygeoprocessing\tests\helper_driver.py:10(interpolate)
252 0.336 0.001 216.716 0.860 C:\Python27\lib\site-packages\scipy\interpolate\rbf.py:225(
__call__)
Ближайший сосед запустить:
27539 function calls in 405.624 seconds
Ordered by: internal time
List reduced from 309 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
252 397.806 1.579 397.822 1.579 {method 'query' of 'ckdtree.cKDTree' objects}
252 1.875 0.007 1.881 0.007 {scipy.interpolate.interpnd._ndim_coords_from_arrays}
252 1.831 0.007 2.101 0.008 C:\Python27\lib\site-packages\numpy\lib\function_base.py:3285(meshgrid)
252 1.034 0.004 400.739 1.590 C:\Python27\lib\site-packages\scipy\interpolate\ndgriddata.py:60(__call__)
1 1.009 1.009 405.030 405.030 C:\Python27\lib\site-packages\pygeoprocessing-0.3.0a8.post28+n5b1ee2de0d07-py2.7-win32.egg\pygeoprocessing\geoprocessing.py:333(interpolate_points_uri)
252 0.719 0.003 0.719 0.003 {_gdal_array.BandRasterIONumPy}
1 0.509 0.509 405.624 405.624 pygeoprocessing\tests\helper_driver.py:10(interpolate)
252 0.261 0.001 0.261 0.001 {numpy.core.multiarray.copyto}
27 0.125 0.005 0.125 0.005 {_ogr.Layer_CreateFeature}
1 0.116 0.116 0.254 0.254 C:\Python27\lib\site-packages\pygeoprocessing-0.3.0a8.post28+n5b1ee2de0d07-py2.7-win32.egg\pygeoprocessing\geoprocessing.py:362(_parse_point_data)
Для справки, я также в том числе визуальный результат этих двух тестов.
Ближайший
Линейный
Почему вы ожидаете, что ближайший сосед будет таким же быстрым или быстрым, как линейный? Они очень разные методы и дают очень разные результаты. – hpaulj
Правда, но линейная интерполяция кажется более сложной. Вам не только нужно знать N точек на пиксель, но и расстояние до них, а также схему интерполяции. Ближе всего требуется знать значение единственной ближайшей точки без дополнительных вычислений. Первая проблема кажется более сложной, чем последняя. @hpaulj, вы ожидали бы обратного? – Rich