python griddata的替代品

时间:2014-10-09 10:51:04

标签: python scipy resampling

我正在使用griddata对网格上的numpy二维数组进行重采样。

z.shape = (1000, 1000)
x, y = np.arange(-5, 5, 0.01), np.arange(-5, 5, 0.01)
newx, newy = np.arange(-2, 2, 0.1), np.arange(-2, 2, 0.1)

griddata((x, y), z, (newx[None, :], newy[:, None]))

代码应该:

  • 重新采样z(代表图像)到新的更粗糙的更精细的网格
  • 新网格不一定涵盖所有原始网格。

然而,griddata无法管理常规输入网格。有谁知道一个简单的替代方案?

1 个答案:

答案 0 :(得分:1)

使用适用于文档中列出的网格数据的任何方法:https://docs.scipy.org/doc/scipy/reference/interpolate.html#multivariate-interpolation

那是:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RegularGridInterpolator.html

https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RectBivariateSpline.html

https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.interpolation.map_coordinates.html

另请注意,您错误地使用了griddata。您的代码对应于从1000(x,y)坐标定义的直线进行插值,其中每个点都有1000个与之关联的值。然而,严格定义了从1D线到2D的插值,并且尝试对沿着一条线的一组点进行三角测量而导致失败。

你应该做

import numpy as np
from scipy.interpolate import griddata

z = np.random.rand(100, 100)
z.shape = (100, 100)
x, y = np.arange(-5, 5, 0.1), np.arange(-5, 5, 0.1)

xx, yy = np.meshgrid(x, y, indexing='ij')

newx, newy = np.arange(-2, 2, 0.1), np.arange(-2, 2, 0.1)

griddata((xx.ravel(), yy.ravel()), z.ravel(), (newx[None, :], newy[:, None]))

这将正常工作---然而,2D中的1000x1000 = 1000000点对于基于三角测量的非结构化插值(需要大量内存用于三角测量+它的速度慢)来说太简单了,所以你应该使用网格化数据算法。