我有点沮丧,因为我找不到解决我的问题的方法,这在r中用包gapfill似乎很容易做到,但在python中就更难了。
我的问题来了:我有一个xarray(3d)以维度纬度、经度和时间。我想要的是在每个栅格/数组中插入nan值(由云和其他扭曲引起)。nan值形成块我的想法是不仅用每个时间步的相邻像素插值,而且用之前和之后的时间步插值。(假设几天前和几天后的像素值非常相似,因为土地覆盖变化不是很快)。我的目标是在相同的像素位置上对时间进行线性插值。(之前和之后有多少个时间步,我也不知道如何在interpn函数中定义?)
我找到了不同的方法来实现这一点,但是目前还没有。我找到的最有希望的方法是从包scipy中找到的interpolate.interpn函数。这个函数使用numpy数组而不是xarray。我的尝试是:
# change from xarray to numpy
my array_np = my array.to_numpy()
# lable dimensions (what is done when building a numpy with meshgrid)
x = array_np [0]
y = array_np [1]
z = array_np [2]
# get index of nan values
nanIndex= np.isnan(array_np ).nonzero()
nanIndex
# name dimensions of nan values
xc= nanIndex[0]
yc= nanIndex[1]
zc= nanIndex[2]
# For using the scipy interpolate. interpn function:
# points = the regular grid - in my case x,y,z
# values = the data on the regular grid - in my case my array (my_array_np)
# point_nan = the point that is evaluate in the 3D grid - in my case xc, y,c, zy
points = (x, y, z) # dimensions
points_nan = (xc, yc, zc) #nandimensions
print(interpolate.interpn(points, my_array_np, points_nan))
我现在得到的错误是:
"The points in dimension 0 must be strictly ascending"
我哪里错了?提前谢谢你的帮助!如果你有其他的解决方案,也解决了我的问题,除了scipy,我也很乐意帮助!
这是我的数组的外观:
array([[[ nan, nan, nan, ..., 279.64 , 282.16998,
279.66998],
[277.62 , 277.52 , 277.88 , ..., 281.75998, 281.72 ,
281.66 ],
[277.38 , 277.75 , 277.88998, ..., 281.75998, 281.75998,
280.91998],
...,
[ nan, nan, nan, ..., 280.72998, 280.33 ,
280.94 ],
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan]],
[[ nan, nan, nan, ..., 272.22 , 271.54 ,
271.02 ],
[280.02 , 280.44998, 281.18 , ..., 271.47998, 271.88 ,
272.03 ],
[280.32 , 281. , 281.27 , ..., 270.83 , 271.58 ,
272.03 ],
...,
[ nan, nan, nan, ..., 290.34 , 290.25 ,
288.365 ],
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan]],
[[ nan, nan, nan, ..., nan, nan,
nan],
[276.44998, 276.19998, 276.19 , ..., nan, nan,
nan],
[276.50998, 276.79 , 276.58 , ..., nan, nan,
nan],
...,
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan]],
...,
[[ nan, nan, nan, ..., 276.38998, 276.44 ,
275.72998],
[ nan, nan, nan, ..., 276.55 , 276.81 ,
276.72998],
[ nan, nan, nan, ..., 279.74 , 277.11 ,
276.97 ],
...,
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan]],
[[ nan, nan, nan, ..., 277.38 , 278.08 ,
277.79 ],
[279.66998, 280.00998, 283.13 , ..., 277.34 , 277.41998,
277.62 ],
[ nan, 277.41 , 277.41 , ..., 277.825 , 277.31 ,
277.52 ],
...,
[ nan, nan, nan, ..., 276.52 , nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan]],
[[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan],
...,
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan],
[ nan, nan, nan, ..., nan, nan,
nan]]], dtype=float32)
1条答案
按热度按时间kninwzqo1#
interpn
不能用于填充规则栅格中的间隙- interpn是用于将完整规则栅格(没有间隙)内插到不同坐标的快速方法。为了用N维插值来填补缺失值,对非结构化的N维数据使用了简洁的插值方法。
由于您要对常规网格进行插值,因此我将演示
scipy.interpolate.griddata
的用法:如下所示
要使用非结构化Scipy插值器,必须将包含缺失值的网格化数据转换为不包含缺失值的1D点矢量:
这将导致数组被填充
请注意,这填充了整个数组,因为可用点的船体覆盖了整个数组。如果不是这样,您可能需要使用最近邻或拟合样条来填充数据的第二步。