在一维中外推 2d numpy 数组
Extrapolate 2d numpy array in one dimension
我有 numpy.array 个模拟数据集,但我缺少边缘点 (x=0.1),我如何 interpolate/extrapolate z 中的数据到边缘?我有:
x = [ 0. 0.00667 0.02692 0.05385 0.08077]
y = [ 0. 10. 20. 30. 40. 50.]
# 0. 0.00667 0.02692 0.05385 0.08077
z = [[ 25. 25. 25. 25. 25. ] # 0.
[ 25.301 25.368 25.617 26.089 26.787] # 10.
[ 25.955 26.094 26.601 27.531 28.861] # 20.
[ 26.915 27.126 27.887 29.241 31.113] # 30.
[ 28.106 28.386 29.378 31.097 33.402] # 40.
[ 29.443 29.784 30.973 32.982 35.603]] # 50.
我想在 z 中添加一个对应于 x = 0.1 的新列,这样我的新 x 将是
x_new = [ 0. 0.00667 0.02692 0.05385 0.08077 0.1]
# 0. 0.00667 0.02692 0.05385 0.08077 0.01
z = [[ 25. 25. 25. 25. 25. ? ] # 0.
[ 25.301 25.368 25.617 26.089 26.787 ? ] # 10.
[ 25.955 26.094 26.601 27.531 28.861 ? ] # 20.
[ 26.915 27.126 27.887 29.241 31.113 ? ] # 30.
[ 28.106 28.386 29.378 31.097 33.402 ? ] # 40.
[ 29.443 29.784 30.973 32.982 35.603 ? ]] # 50.
哪里都是'?'替换为 interpolated/extrapolated 数据。
感谢您的帮助!
您看过 scipy.interpolate2d.interp2d(使用样条曲线)吗?
from scipy.interpolate import interp2d
fspline = interp2d(x,y,z) # maybe need to switch x and y around
znew = fspline([0.1], y)
z = np.c_[[z, znew] # to join arrays
编辑:
我和@dnalow设想的方法是这样的:
import numpy as np
import matplotlib.pyplot as plt
# make some test data
def func(x, y):
return np.sin(np.pi*x) + np.sin(np.pi*y)
xx, yy = np.mgrid[0:2:20j, 0:2:20j]
zz = func(xx[:], yy[:]).reshape(xx.shape)
fig, (ax1, ax2, ax3, ax4) = plt.subplots(1,4, figsize=(13, 3))
ax1.imshow(zz, interpolation='nearest')
ax1.set_title('Original')
# remove last column
zz[:,-1] = np.nan
ax2.imshow(zz, interpolation='nearest')
ax2.set_title('Missing data')
# compute missing column using simplest imaginable model: first order Taylor
gxx, gyy = np.gradient(zz[:, :-1])
zz[:, -1] = zz[:, -2] + gxx[:, -1] + gyy[:,-1]
ax3.imshow(zz, interpolation='nearest')
ax3.set_title('1st order Taylor approx')
# add curvature to estimate
ggxx, _ = np.gradient(gxx)
_, ggyy = np.gradient(gyy)
zz[:, -1] = zz[:, -2] + gxx[:, -1] + gyy[:,-1] + ggxx[:,-1] + ggyy[:, -1]
ax4.imshow(zz, interpolation='nearest')
ax4.set_title('2nd order Taylor approx')
fig.tight_layout()
fig.savefig('extrapolate_2d.png')
plt.show()
您可以通过
改进估算
(a) 添加高阶导数(又名泰勒展开),或
(b) 计算更多方向的梯度,而不仅仅是 x 和 y(然后相应地对梯度进行加权)。
此外,如果您预先平滑图像(现在我们有一个完整的 Sobel 过滤器...),您将获得更好的渐变。
我有 numpy.array 个模拟数据集,但我缺少边缘点 (x=0.1),我如何 interpolate/extrapolate z 中的数据到边缘?我有:
x = [ 0. 0.00667 0.02692 0.05385 0.08077]
y = [ 0. 10. 20. 30. 40. 50.]
# 0. 0.00667 0.02692 0.05385 0.08077
z = [[ 25. 25. 25. 25. 25. ] # 0.
[ 25.301 25.368 25.617 26.089 26.787] # 10.
[ 25.955 26.094 26.601 27.531 28.861] # 20.
[ 26.915 27.126 27.887 29.241 31.113] # 30.
[ 28.106 28.386 29.378 31.097 33.402] # 40.
[ 29.443 29.784 30.973 32.982 35.603]] # 50.
我想在 z 中添加一个对应于 x = 0.1 的新列,这样我的新 x 将是
x_new = [ 0. 0.00667 0.02692 0.05385 0.08077 0.1]
# 0. 0.00667 0.02692 0.05385 0.08077 0.01
z = [[ 25. 25. 25. 25. 25. ? ] # 0.
[ 25.301 25.368 25.617 26.089 26.787 ? ] # 10.
[ 25.955 26.094 26.601 27.531 28.861 ? ] # 20.
[ 26.915 27.126 27.887 29.241 31.113 ? ] # 30.
[ 28.106 28.386 29.378 31.097 33.402 ? ] # 40.
[ 29.443 29.784 30.973 32.982 35.603 ? ]] # 50.
哪里都是'?'替换为 interpolated/extrapolated 数据。 感谢您的帮助!
您看过 scipy.interpolate2d.interp2d(使用样条曲线)吗?
from scipy.interpolate import interp2d
fspline = interp2d(x,y,z) # maybe need to switch x and y around
znew = fspline([0.1], y)
z = np.c_[[z, znew] # to join arrays
编辑:
我和@dnalow设想的方法是这样的:
import numpy as np
import matplotlib.pyplot as plt
# make some test data
def func(x, y):
return np.sin(np.pi*x) + np.sin(np.pi*y)
xx, yy = np.mgrid[0:2:20j, 0:2:20j]
zz = func(xx[:], yy[:]).reshape(xx.shape)
fig, (ax1, ax2, ax3, ax4) = plt.subplots(1,4, figsize=(13, 3))
ax1.imshow(zz, interpolation='nearest')
ax1.set_title('Original')
# remove last column
zz[:,-1] = np.nan
ax2.imshow(zz, interpolation='nearest')
ax2.set_title('Missing data')
# compute missing column using simplest imaginable model: first order Taylor
gxx, gyy = np.gradient(zz[:, :-1])
zz[:, -1] = zz[:, -2] + gxx[:, -1] + gyy[:,-1]
ax3.imshow(zz, interpolation='nearest')
ax3.set_title('1st order Taylor approx')
# add curvature to estimate
ggxx, _ = np.gradient(gxx)
_, ggyy = np.gradient(gyy)
zz[:, -1] = zz[:, -2] + gxx[:, -1] + gyy[:,-1] + ggxx[:,-1] + ggyy[:, -1]
ax4.imshow(zz, interpolation='nearest')
ax4.set_title('2nd order Taylor approx')
fig.tight_layout()
fig.savefig('extrapolate_2d.png')
plt.show()
您可以通过
改进估算
(a) 添加高阶导数(又名泰勒展开),或
(b) 计算更多方向的梯度,而不仅仅是 x 和 y(然后相应地对梯度进行加权)。
此外,如果您预先平滑图像(现在我们有一个完整的 Sobel 过滤器...),您将获得更好的渐变。