为相同边界框但不同网格结构的平面在 2D 平面上插值
interpolating values on 2D plane for planes of same bounding box but different mesh structure
我在每条相交的网格线(即节点)处的计算网格上提供了模拟数据,并希望将其插值到具有相同维度(即它们都具有相同的边界框)的新二维平面上,但是对于post-处理原因我需要笛卡尔网格而不是任意曲线网格。下图演示了这个问题(顶部网格是我可以使用计算数据的地方,底部网格是我要将这些值插值到的地方)
顶部图像中的间隙(即没有可用信息的地方)可以简单地在插值平面(底部图像)上用零或 -1 填充,表示此处没有可用值。
计算数据(上图)的数据本质上是 CSV 数据,例如(对于在 xmin = 0、ymin = 0、xmax = 1、ymax = 5 之间的 x-y 平面中定向的 2D 平面)
x, y, z, data_1, data_2, ..., data_n
0.0, 0.0, 0.0, 1.0, 1.7, ..., 0.9
0.1, 0.0, 0.0, 1.1, 1.3, ..., 1.2
0.2, 0.0, 0.0, 1.3, 1.1, ..., 1.3
..., ..., ..., ..., ..., ..., ...
1.0, 5.0, 0.0, 1.0, 0.3. ..., 0.6
但是,鉴于上图,x和y中的数据条目可能并不总是排序的。
我现在的问题是是否有 package/library 可以执行这种插值(而不是重新发明轮子)?我对语言很灵活,但如果可以选择的话,我更喜欢 c++ / python。
在 python 中您可以使用 scipy.interpolate.griddata。这接受非结构化数据并将其插入给定点:
from scipy.interpolate import griddata
import numpy as np
# Generate some xy coordinates at random positions and some values at each coordinate:
xy = [(x, y) for x, y in np.random.random((100, 2))]
v = [(x - y, x+y) for x, y in xy] # Note - v can have more than 1 dimension if desired
# Define a grid:
grid = [(x, y) for x in np.linspace(0, 1, 21) for y in np.linspace(0, 1, 21)]
# Interpolate v onto the grid
interpolated = griddata(xy, v, grid)
# interpolated[n] is the value at the position grid[n], for example
# grid[50] = 0.1, 0.4
# interpolated[5] = [-0.3, 0.5] ( = 0.1-0.4, 0.1+0.4)
在您的情况下,您需要注意 griddata
将在网格的间隙中进行插值 - 值不会是 0 或 1,它们将是间隙周围点之间的任何插值产量。
我在每条相交的网格线(即节点)处的计算网格上提供了模拟数据,并希望将其插值到具有相同维度(即它们都具有相同的边界框)的新二维平面上,但是对于post-处理原因我需要笛卡尔网格而不是任意曲线网格。下图演示了这个问题(顶部网格是我可以使用计算数据的地方,底部网格是我要将这些值插值到的地方)
顶部图像中的间隙(即没有可用信息的地方)可以简单地在插值平面(底部图像)上用零或 -1 填充,表示此处没有可用值。
计算数据(上图)的数据本质上是 CSV 数据,例如(对于在 xmin = 0、ymin = 0、xmax = 1、ymax = 5 之间的 x-y 平面中定向的 2D 平面)
x, y, z, data_1, data_2, ..., data_n
0.0, 0.0, 0.0, 1.0, 1.7, ..., 0.9
0.1, 0.0, 0.0, 1.1, 1.3, ..., 1.2
0.2, 0.0, 0.0, 1.3, 1.1, ..., 1.3
..., ..., ..., ..., ..., ..., ...
1.0, 5.0, 0.0, 1.0, 0.3. ..., 0.6
但是,鉴于上图,x和y中的数据条目可能并不总是排序的。
我现在的问题是是否有 package/library 可以执行这种插值(而不是重新发明轮子)?我对语言很灵活,但如果可以选择的话,我更喜欢 c++ / python。
在 python 中您可以使用 scipy.interpolate.griddata。这接受非结构化数据并将其插入给定点:
from scipy.interpolate import griddata
import numpy as np
# Generate some xy coordinates at random positions and some values at each coordinate:
xy = [(x, y) for x, y in np.random.random((100, 2))]
v = [(x - y, x+y) for x, y in xy] # Note - v can have more than 1 dimension if desired
# Define a grid:
grid = [(x, y) for x in np.linspace(0, 1, 21) for y in np.linspace(0, 1, 21)]
# Interpolate v onto the grid
interpolated = griddata(xy, v, grid)
# interpolated[n] is the value at the position grid[n], for example
# grid[50] = 0.1, 0.4
# interpolated[5] = [-0.3, 0.5] ( = 0.1-0.4, 0.1+0.4)
在您的情况下,您需要注意 griddata
将在网格的间隙中进行插值 - 值不会是 0 或 1,它们将是间隙周围点之间的任何插值产量。