2015-03-02 6 views
7

voglio interpolare una matrice NumPy, e il np.interp fa quasi esattamente quello che voglio:interp NumPy diminuendo xp

interp(x, xp, fp, left=None, right=None) 
One-dimensional linear interpolation. 

Tranne che per questo bit:

Non controllare che il la coordinata x sequenza xp è in aumento. Se xp non aumenta, i risultati non hanno senso.

mio xp è decrescente, in modo che è meglio: Invertendo la direzione di entrambi xp un fp:

np.interp(x, xp[::-1], fp[::-1]) 

o invertente x e xp:

np.interp(-x, -xp, fp) 

O c'è un ancora meglio?

+0

Qualche differenza nei risultati? – hpaulj

+0

@hpaulj Non che io possa vedere. – chw21

+0

Penso che il primo potrebbe essere migliore, perché non verrà generato alcun array temporaneo nel processo. – Kattern

risposta

4

Grazie per tutti coloro che hanno dato il loro contributo, in particolare @Jaime.

ho sperimentato un po ', ed è venuto a questa conclusione:

1) A parte gli errori di arrotondamento, entrambi i metodi citati da me hanno lo stesso risultato.

2) Entrambi prendono molto la stessa quantità di tempo

3) ho provato la versione SciPy, ma sarebbe respingere la bandiera assume_sorted. Forse la mia versione di Scipy è obsoleta. Sospetto che se quella bandiera viene sollevata, scipy ordina internamente gli array. Ma i valori sono ordinati, solo nella direzione opposta, quindi non è necessario farlo.

In ogni caso, io uso il metodo reverse-direzione:

np.interp(x, xp[::-1], fp[::-1]) 

Basta ricordare che in questo caso, si dovrà anche invertire left e right, se ne avete bisogno.

+0

Questa soluzione non tiene conto di entrambi i casi di valori x ordinati e non ordinati. L'opzione assumed_sorted nella funzione interpolate.interp1d dovrebbe funzionare per te. – hakanc

+0

Come per la domanda, nel mio caso i valori x sono ordinati, solo in ordine decrescente.E no, l'opzione 'assume_sorted = False' non ha funzionato per me perché la mia versione di' scipy' è troppo vecchia. – chw21

3

Se si ha accesso a Scipy, è possibile utilizzare la funzione interp1d, che ha la parola chiave assume_sorted=False per gestire gli array in diminuzione.

Modifica: questa soluzione gestisce entrambi i casi di valori x ordinati e non ordinati.

import numpy as np 
from scipy import interpolate 
import matplotlib.pyplot as plt 

# Decreasing array 
x = np.arange(0, 10)[::-1] 
y = np.exp(-x/3.0) 

# Interpolation object 
f = interpolate.interp1d(x, y, assume_sorted = False) 

xnew = np.arange(3,5) 
ynew = f(xnew) # use interpolation function returned by `interp1d` 
plt.plot(x, y, 'o', xnew, ynew, '-') 
plt.show()