- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 256 x 256 x 32 的网格,由规则间隔的点组成,分布在 x、y 和 z 上,并带有一个关联的变量“a”。我还有一组随机散布在更有限的 x、y、z 空间中的点,并带有相关变量“b”。我本质上想要做的是将我的随机数据内插和外推到与“a”立方体匹配的规则间隔网格,如下所示:
到目前为止,我已经使用 scipy 的 griddata 来实现插值,这似乎工作正常,但它无法处理外推(据我所知)并且输出急剧截断为“nan”值。在研究这个问题时,我遇到了几个人第二次使用 griddata 使用“最近”作为填充“nan”值的插值方法。我试过这个,但结果似乎不可靠。如果我使用带有“线性”模式的 fill_Value 会获得更合适的外观结果,但目前它更像是一种软糖,因为 fill_Value 必须是一个常量。
我注意到 MATLAB 有一个 ScatteredInterpolant 类,它似乎可以满足我的要求,但是我无法在 Python 中找到等效的类,也无法弄清楚如何在 3D 中有效地实现这样的例程。非常感谢任何帮助。
我用于插值的代码如下:
x, y, z, b = np.loadtxt(scatteredfile, unpack = True)
# Create cube to match aCube dimensions
xi = np.linspace(-xmax_aCube, xmax_aCube, 256)
yi = np.linspace(-ymax_aCube, ymax_aCube, 256)
zi = np.linspace(zmin_aCube, zmax_aCube, 32)
# Interpolate scattered points
X, Y, Z = np.meshgrid(xi, yi, zi)
bCube = griddata((x, y, z), b, (X, Y, Z), method = 'linear')
最佳答案
这个讨论适用于任何维度。对于您的 3D 案例,让我们先谈谈计算几何,以了解为什么部分区域给出 NaN
来自 griddata
.
体积中的分散点构成一个凸包;具有以下属性的几何形状:
griddata
这样的算法选择返回
NaN
- 这是告知科学家他/她必须选择合理的外推方式的最安全方式。
# With a unit cube, and selected scalar value
x, y, z, b = np.loadtxt(scatteredfile, unpack = True)
s = mean(b)
x.append([0 0 0 0 1 1 1 1])
y.append([0 0 1 1 0 0 1 1])
z.append([0 1 0 1 0 1 0 1])
b.append([s s s s s s s s])
# drop in the rest of your code
bCube = griddata((x, y, z), b, (X, Y, Z), method = 'linear', fill_value=nan)
bCubeNearest = griddata((x, y, z), b, (X, Y, Z), method = 'nearest')
indicesMask = isNan(bCube)
# Use nearest interpolation outside the hull, keeping linear interpolation inside.
bCube(indicesMask) = bCubeNearest(indicesMask)
D
,这可能与您的盒子的长度相似或两倍(比如说)。你可以调整。对于每个 NaN 位置,计算到每个分散点的距离。
# Don't do it this way for anything but small matrices - this is O(NM)
# and it can be done much more effectively (e.g. MATLAB has a quick
# natural weighting option), but for illustrative purposes:
for each NaN point 1:N
for each scattered point 1:M
calculate a basis function using inverse distance from NaN to point, normalised on D, and store in a [1 x M] vector of weights
Multiply weights by the b value, summate and divide by M
关于python - 随机散布数据的内插和外推到 3D 均匀网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21993655/
我需要在半径R的圆内生成一个均匀随机点。 我意识到,通过在区间 [0 ... 2π) 中选择均匀随机的角度,并在区间 (0 ... R) 中选择均匀随机的半径,我最终会得到更多的点朝向中心,因为对于两
我想在一个正方形内生成 N 个点(均匀地)。我怎样才能做到这一点? 最佳答案 非常酷的问题,比我想象的要困难得多,但这就是想法。有关于 n 边形的论文,但我只会做正方形。因此,圆的均匀分布是一个常见问
考虑以下示例: import itertools import numpy as np a = np.arange(0,5) b = np.arange(0,3) c = np.arange(0,7)
SQL Server 将一组值分成 5 组,每组的 sum(count) 应该均匀分布。 表仅包含 2 列 rid 和 count。 create table t1(rid int, count in
我有以下简单的 HTML。 A B C 和 CSS: ul { width: 100%; display: flex; flex-direction:
我是一名优秀的程序员,十分优秀!