繁体   English   中英

在NaN上进行科学ND插值

[英]scipy ND Interpolating over NaNs

我一直在解决如何使用scipy.interpolate函数(LinearNDInterpolator,griddata或优选NearestNDInterpolator)时遇到麻烦

网上有一些教程,但是我很困惑我的数据需要以什么形式输入。NearestND的在线文档非常糟糕。

该功能要求:

    x : (Npoints, Ndims) ndarray of floats
         Data point coordinates.
    y : (Npoints,) ndarray of float or complex
         Data point values.

我有以下形式的数据:xarray数据集内保存的纬度,经度,数据,时间。 我要填写的数据有些空白。

我不明白如何告诉函数我的x点。 我已经尝试过(拉特,长)作为一个元组和np.meshgrid(拉特,长),但似乎无法解决。

关于如何将纬度,经度坐标传递给函数的任何帮助? 时间坐标的奖励点也可以使第三个维度的估算更加可靠。

谢谢!

我曾试过(lat,long)作为元组

如果latlong是一维数组或列表,请尝试以下操作:

points = np.array((lat, long)).T # make a 2D array of shape Npoints x 2
nd = NearestNDInterpolator(points, data)

您可以将插值计算为nd(lat1, long1)等。

Scipy为非结构化数据和规则放置在网格上的数据点提供了多元插值方法 非结构化数据意味着可以将数据提供为无序点列表。 您的数据似乎是结构化的:它是一个大小数组(480、2040)。 但是, NearestNDInterpolator可处理非结构化数据。 flatten方法可用于将数组转换为值(长度为480 * 2040)的列表(1d)。 必须对坐标执行相同的操作。 meshgrid用于获取网格中每个点的坐标,并且再次使用flatten获取2d坐标的“列表”(形状为480 * 2040 x 2的数组)。

这是一个从结构化数据到非结构化数据的示例:

import numpy as np

lat = np.linspace(2, 6, 10)
lon = np.linspace(5, 9, 14)

latM, lonM = np.meshgrid(lat, lon)  # M is for Matrix

dataM = np.sin(latM)*np.cos(lonM)  # example of data, Matrix form

from scipy.interpolate import NearestNDInterpolator

points = np.array((latM.flatten(), lonM.flatten())).T
print( points.shape )
# >>> (140, 2)

f_nearest = NearestNDInterpolator(points, dataM.flatten())
f_nearest(5, 5)

在这种情况下,使用NaN并不是大问题,因为它只是列表中的缺失点,除了缺失点的坐标也必须从列表中删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM