scipy 如何从包含所有原始数据点的不规则数据创建规则间隔的网格?值得这么做吗?

jdgnovmf  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(130)

我有数据在以下方式:x经度数组、y经度数组以及这些纬度和经度的降雨量z数组。我想创建一个矩阵来测试不同的插值方法(其中许多方法在scipy或类似工具包中默认不可用)。xy不均匀地间隔但具有相同的长度(即,x的某些部分具有以下值:34.9912, 35.1568, 35.8881,但后来x包含46, 45, 47)。我想创建一个最粗糙的可能的规则间隔矩阵,包含每一个点。我举了一个例子:
假设x=[36,38,31]y=[12,19,15]z=[1,2,3]。我想创建以下矩阵:

0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0

字符串
其中正值位于函数取值的位置。我如何在Python或其他语言中做到这一点?(我更喜欢Python)
有人问了一个类似的问题here,并被告知要做以下事情:

from scipy import interpolate
f1 = interpolate.interp1d(x, y)
x_new = np.linspace(x[0], x[-1], max_len)
y_new = f1(x_new)


但是这不起作用,因为它不包含原始点。另外,scipy.interpolate.interp1d很快就会被弃用,所以我正在寻找一个更现代的解决方案。
上面的例子显然是一个带有整数间隔的玩具例子。由于真实的数据包含小数点后第四位,我可以预见,我需要至少10000个点才能向前移动一个整数,这在处理真实数据时会很快变得笨拙,最终可能包含整个世界。它不是存储数据,而是插值,这需要时间,所以我希望尽可能减少计算时间。
不过,我不知道这是否处理问题的最佳方法。互联网上的例子建议使用griddata或类似的东西来快速生成网格。然而,这具有不均匀间隔的缺点,并且仅创建网格。使用像linspace(x[0],x[-1],10000)这样的东西是正确的方法吗?如果我最终使用我提出的方法,并且如果事实证明它可以以更简单的方式完成,那么我不想浪费我的时间,我可以预见在测试插值时会有无尽的等待时间。
编辑1:正如@Reinderien所建议的,这是纬度和经度的直方图:
x1c 0d1x的数据



以下是通过np.diff(np.sort)

获得的直方图
[

] 4
编辑2:第二部分x1c4d 1xx 1c 5d 1x的更好的分箱图

6fe3ivhb

6fe3ivhb1#

值得这么做吗?
这取决于很多事情,包括你有多少点,你需要什么样的精度和你能维持什么样的记忆影响。
从根本上说,这是一个GCD;产生以下轴:

import numpy as np

x = np.array([36, 38, 30])
y = np.array([12, 19, 15])
z = np.array([1, 2, 3])

xspace = np.gcd.reduce(np.diff(np.sort(x)))
yspace = np.gcd.reduce(np.diff(np.sort(y)))
xreg = np.arange(x.min(), x.max() + xspace, xspace)
yreg = np.arange(y.min(), y.max() + yspace, yspace)
print(xreg)
print(yreg)

个字符
在两个维度上的微分被输入到一个GCD中,它给你最粗略的间距。请注意,我已经将您的输入数据更改为“更有趣”,因此xspace的值为2;否则,您的两个示例数组都具有最大公约数为1的微分。
对于浮点值,例如34.9912,您需要乘以精度因子(1 e4?)并强制转换为整数。精度因子越高,正则化网格可能会变得越大。

vfwfrxfs

vfwfrxfs2#

一种可能性是考虑使用高斯过程来生成一个函数,该函数可以预测任意点的值,然后从你想要的任何网格中生成这些点。下面的例子使用了一个默认的内核,它只规定了一个一般平滑的函数。如果您希望在拟合中获得特定的行为,您必须对内核进行自己的研究。

from sklearn.gaussian_process import GaussianProcessRegressor

x = [36, 38, 31]
y = [12, 19, 15]
z = [1, 2, 3]

X = list(zip(y, x))

gpr = GaussianProcessRegressor().fit(X, z)

gridx = np.arange(-40, 40, 1)

grid = list(it.product(gridx, gridx))
pred = gpr.predict(grid)

img = np.array(pred).reshape((80, 80))

plt.figure()
plt.imshow(img, extent = [-40, 40, 40, -40])

字符串

相关问题