你的问题是由一个非常危险的小错误引起的,我认为它值得给出一个完整的答案。在
考虑这一行:points = np.reshape(np.array([x, y]),(z.size, 2))
由于您的输入数组是1d,所以您试图将[x,y]转换为形状(something,2)”。请注意,可以这样说
^{pr2}$
让numpy为你推断缺失的维度,而这仍然不是你想要的。构建二维阵列时np.array([x, y])
您正在逐行定义一个矩阵,从而创建一个shape“(2,something)”数组。当你调用它时,它将逐行读取元素,因为NUMPY以行的主要顺序存储数组(类似C/C++,不像FORTRAN和Matlab)。这意味着生成的两列数组将首先包含所有x值,然后包含所有y值,而不是在每一行中包含(x,y)对。在
实际上,您要做的是在不接触数组结构的情况下,交换数组的维数。这意味着你必须转换矩阵。这意味着你必须使用points = np.array([x, y]).T
# or np.transpose([x,y])
相反。请注意,虽然它与原始文件具有相同的shape,但它的元素顺序是正确的:In [320]: np.reshape(np.array([x,y]),(-1,2))
Out[320]:
array([[ 20.7 , 20.702 ],
[ 20.704 , 20.706 ],
[ 20.708 , 20.71 ],
...,
[ 852.356964, 852.356964],
[ 852.356964, 852.356964],
[ 852.356964, 852.356964]])
In [321]: np.array([x,y]).T
Out[321]:
array([[ 20.7 , 852.357235],
[ 20.702 , 852.357235],
[ 20.704 , 852.357235],
...,
[ 21.296 , 852.356964],
[ 21.298 , 852.356964],
[ 21.3 , 852.356964]])
这将修复示例x/y点和z之间的不一致,并将产生预期的结果。根据我的经验,reshape-ing几乎从未被要求过。通常需要将ndarray展平为1d一个,但是给定数组的ravel()方法是最好的。在
结果作为证明:左边,你原来用三次插值;右边,修正了points的版本:
注意,作为@MaxNoe suggested,我将插值网格大小减小到200x200。正如他们所暗示的那样,Rbf的内存错误很可能源于大量的插值点。在