我有一個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