如果输入 'values' 包含 nan,为什么 scipy.griddata return nans 带有 'cubic' 插值?

Why does scipy.griddata return nans with 'cubic' interpolation if input 'values' contains nan?

我想使用 scipy.griddata 对包含一些 nan 值的数组执行三次插值。但是,一旦 values 参数中出现单个 nan,返回的插值将仅填充 nan。使用 'nearest' 或 'linear' 插值方法时情况并非如此。

这种行为的原因是什么?是否有一种简单的方法可以忽略 values 输入中的 nan?

这是一个最小的工作示例,改编自 griddata scipy interpolation not working (giving nan):

import numpy as np

def func(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

grid_x, grid_y = np.mgrid[0:1:10j, 0:1:10j]
points = np.random.rand(100, 2)
values = func(points[:,0], points[:,1])

values[0]=np.nan # now add a single nan value to the array

from scipy.interpolate import griddata

grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest') # no nans here
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear') # this has nans on the edges (as expected)
grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic') # this is filled only with nans.

一种解决方案是在插入数据之前从 pointsvalues 输入数组中删除所有 nannumpy 可以有效地用于这样做:

import numpy as np

def func(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

grid_x, grid_y = np.mgrid[0:1:10j, 0:1:10j]
points = np.random.rand(100, 2)
values = func(points[:,0], points[:,1])

values[0]=np.nan # now add a single nan value to the array

#Find all the indexes where there is no nan neither in values nor in points.
nonanindex=np.invert(np.isnan(points[:,0]))*np.invert(np.isnan(points[:,1]))*np.invert(np.isnan(values))

#Remove the nan using fancy indexing. griddata can now properly interpolate. The result will have nan only on the edges of the array
from scipy.interpolate import griddata
grid_z2 = riddata(np.stack((points[nonanindex,0],points[nonanindex,1]),axis=1), values[nonanindex], (grid_x, grid_y), method='cubic')

虽然这解决了问题,但我还没有回答为什么griddata函数的这个问题只出现在三次插值上。