微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy.interpolate.interp2d:我真的有太多数据点吗?

如何解决scipy.interpolate.interp2d:我真的有太多数据点吗?

我在X,Y网格上有一组高程测量值。我正在尝试通过高程创建一个切片(在某个角度下,因此在网格点上并不完美)。我考虑过从scipy使用2D插值方法,但出现错误OverflowError:数据点太多,无法进行插值。我没有足够多的人,所以我想知道为什么这会出错。

我的数据:

>>> XX.shape,YY.shape,depth_array.shape
((787,1858),(787,1858))

>>> XX
array([[  0,...,0],[  1,1,1],[  2,2,2],[784,784,784],[785,785,785],[786,786,786]])

>>> YY
array([[   0,1855,1856,1857],[   0,1857]])

>>> depth_array
array([[0.,0.,0.],[0.,0.]])
# The depth array seems empty,but that's not the case (but that are quite a few zero values)

>>> interpolate.interp2d(YY,XX,depth_array,kind='linear')
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "/Users/yorian/.pyenv/versions/3.7.5/envs/euromax/lib/python3.7/site-packages/scipy/interpolate/interpolate.py",line 229,in __init__
    self.tck = fitpack.bisplrep(x,y,z,kx=kx,ky=ky,s=0.0)
File "/Users/yorian/.pyenv/versions/3.7.5/envs/euromax/lib/python3.7/site-packages/scipy/interpolate/_fitpack_impl.py",line 956,in bisplrep
    msg=msg)
File "/Users/yorian/.pyenv/versions/3.7.5/envs/euromax/lib/python3.7/site-packages/scipy/interpolate/_fitpack_impl.py",line 48,in _int_overflow
    raise OverflowError(msg)
OverflowError: Too many data points to interpolate

我现在正在使用RectBivariateSpline,但这似乎适合样条曲线,我需要2D线性插值。 (787,1858)点真的太多了吗?如果是这样,我该如何实现?

解决方法

如果您有规则的网格,仅提供x和y坐标的一维数组就足够了。这虽然计算量较少,但是对于通用网格,我不知道这是否是错误消息的原因。


import numpy as np
from scipy import interpolate

nx = 787
ny = 1858
depth_array = np.random.random((ny,nx))
res = interpolate.interp2d(range(nx),range(ny),depth_array,kind='linear')

我尝试重现您的错误,并在使用常规网格x,y = np.meshgrid(np.arange(nx),np.arange(ny))时大致发现了此行为:

  • nx*ny < 200000:有效
  • nx*ny > 200000:MemoryError
  • nx*ny > 250000:OverflowError

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。