我有一个3D阵列,我需要插入一个轴(最后一维)。比方说y.shape = (nx, ny, nz)
,我想每(nx, ny)
插入nz
。不过,我想在每个[i, j]
内插一个不同的值。三维阵列快速插值
这里有一些代码来举例说明。如果我想,内插一个值,说new_z
,我会用scipy.interpolate.interp1d
这样
# y is a 3D ndarray
# x is a 1D ndarray with the abcissa values
# new_z is a number
f = scipy.interpolate.interp1d(x, y, axis=-1, kind='linear')
result = f(new_z)
然而,对于这个问题是什么其实我想要的是插值到不同new_z
每个y[i, j]
。所以我这样做:
# y is a 3D ndarray
# x is a 1D ndarray with the abcissa values
# new_z is a 2D array
result = numpy.empty(y.shape[:-1])
for i in range(nx):
for j in range(ny):
f = scipy.interpolate.interp1d(x, y[i, j], axis=-1, kind='linear')
result[i, j] = f(new_z[i, j])
不幸的是,由于多个循环,这变得低效率和慢。有没有更好的方法来做这种插值?线性插值就足够了。一种可能性是在Cython中实现这一点,但我试图避免这种情况,因为我想要更改为三次插值的灵活性,并且不想在Cython中手动完成。
谢谢。你的解决方案也很有趣。我对这么多好的答案感到惊讶。不幸的是,我只能接受一个。尽管您的解决方案没有加速Cython或@pv的解决方案,但它更适合构建问题。而且在插值方面最为灵活。所以我接受它。 – tiago
我想运行这段代码,但我得到这个错误'BSpline'对象不可迭代 – Delosari