Ho una matrice 3D che ho bisogno di interpolare su un asse (l'ultima dimensione). Diciamo y.shape = (nx, ny, nz)
, voglio interpolare in nz
per ogni (nx, ny)
. Tuttavia, voglio interpolare per un valore diverso in ogni [i, j]
.Interpolazione veloce su array 3D
Ecco un codice per esemplificare. Se volessi interpolare a un singolo valore, diciamo new_z
, userei scipy.interpolate.interp1d
come questo
# 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)
Tuttavia, per questo problema quello che realmente voglio è di interpolare a una diversa per ogni new_z
y[i, j]
. Così faccio questo:
# 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])
Sfortunatamente, con loop multipli questo diventa inefficiente e lento. C'è un modo migliore per fare questo tipo di interpolazione? L'interpolazione lineare è sufficiente. Una possibilità è di implementare questo in Cython, ma stavo cercando di evitarlo perché voglio avere la flessibilità di passare all'interpolazione cubica e non voglio farlo a mano in Cython.
Grazie. La tua soluzione è anche molto interessante. Sono rimasto sorpreso da così tante buone risposte. Sfortunatamente, posso accettarne solo uno. Anche se la tua soluzione non ha la velocità di Cython o la soluzione di @ pv, è quella più adatta per l'inquadratura della domanda. E il più flessibile in termini di tipo di interpolazione. Quindi lo accetto. – tiago
Sto cercando di eseguire questo codice ma sto ricevendo questo errore L'oggetto 'BSpline' non è iterabile – Delosari