Werte auf verschiedene Art und Weise interpolieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hallo allerseits,

ich komm nicht so ganz klar mit der Interpolations API von numpy. Ich hab eine Liste von Tupeln gegeben, die folgende Form haben: (zeitpunkt, wert). Dabei ist der Wert ein numpy array.

Soweit so gut. Auf der Seite sind zwar viele Beispiele: http://docs.scipy.org/doc/scipy/referen ... olate.html aber hier wird immer eine Ausgangsfunktion zugrunde gelegt, die ich bei mir nicht habe. Lineare Interpolation habe ich schon von Hand Implementiert, aber warum das Rad neu erfinden? Überseh ich da was in der API? Später will ich kubische/splin Interpolation auch einbauen.

Grüße,
anogayales
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Und wo ist Dein Problem? Die von Dir verlinkte Doc zeigt doch genau das Beispiel, daß Du erfragst? (Allerdings würde ich aus Bequemlichkeit meine Daten eher so beschreiben wie in den Docs und nicht wie Du gerade andeutest: Listen von Tuplen von Arrays sind nicht direkt als numpy.ndarray zu verstehen oder dort hinein zu konvertieren.)

Ggf. zeige doch mal Code.

Gruß,
Christian
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

So, ich hab mich ein bisschen eingearbeitet, bin auf folgendes gekommen. Mit den extrahierten Daten:

Code: Alles auswählen

x = [1,20,80,200]
y = [numpy.array([[randint(0,100), randint(0,100), randint(0,100)]]) for _ in range(len(x))]
f = interp1d(x,y, kind="quadratic", fill_value=0)
Leider bekomme ich

Code: Alles auswählen

  File "C:\Python27\lib\site-packages\scipy\interpolate\interpolate.py", line 480, in _dot0
    return dot(a, b.transpose(axes))
ValueError: objects are not aligned
Was mache ich falsch? Muss ich eine andere Achse definieren?

Grüße,
anogayales
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Guck dir mal x und y an, was da rauskommt, die passen so gar nicht zusammen. interp1d erwartet einen Punkt in y pro Punkt in x.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Aus der Doku:
y : array_like
A N-D array of real values. The length of `y` along the interpolation
axis must be equal to the length of `x`.
Also sind Arrays nicht so ganz falsch.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ja, das nicht. Doch wie Dein Zitat schon sagt: Entlang der zu interpolierenden Achse müssen die Dimensionen auch stimmen. Du gibst aber unterschiedlich viele vor.

Also, ich verstehe nicht ganz, was Du machen möchtest:
- Entweder für jeden Zeitpunkt xi wurden mehrere Werte yi,j...n gemessen. In dem Fall kann man ja einfach für jedes Tupel (mathematisches Tupel) yi,j...n den Mittelwert berechnen und auf dieser Basis interpolieren. Die Unsicherheit der Interpolation ist dann (meist) gleichzusetzen mit der Interpolation der Fehler (z. B. Standardfehler des Mittelwertes).
- Oder Du hast in Wahrheit "flache" multivariate Daten. Dann könntest Du das griddata-Beispiel nehmen und mit einem "flachen" grid arbeiten, das 1xN Dimensionen hat mit N = len(x). Hierbei allerdings bin ich mir nicht klar, wie physikalisch sinnvoll diese Auffassung ist. Da solltest Du entweder hier nochmal mehr erklären oder Dich an einen Betreuer bei Dir vor Ort wenden.

HTH
Christian
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Es geht mir darum in einem Animationsprogramm einen 3-Komponentigen Vektor, wie Position zu interpolieren. Hab jetzt mal eine andere Achse gewählt und es scheint damit zu klappen.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

So ganz komm ich mit dem Beispiel nicht klar. Unter "Interpolation of an N-D curve":
Kleines Testskript geschrieben, da meine Daten mehr oder weniger so vorliegen:

Code: Alles auswählen

from numpy import arange, cos, linspace, pi, sin, random
from scipy.interpolate import splprep, splev

x = [1,20,90,120,125]
y = [0,50,0,45,80]

# spline parameters
s=3.0 # smoothness parameter
k=2 # spline order
nest=-1 # estimate of number of knots needed (-1 = maximal)

# find the knot points
tckp,u = splprep([y,x],s=s,k=k,nest=-1)

# evaluate spline, including interpolated points
xnew,ynew = splev(linspace(1,125,125),tckp)

import pylab
data,=pylab.plot(x,y,'bo-',label='data')
fit,=pylab.plot(xnew,ynew,'r-',label='fit')
pylab.show()
Die angepasste Kurve passt, leider überhaupt nicht zu meiner ursprünglichen. Die Doku: http://docs.scipy.org/doc/scipy/referen ... lprep.html ist da leider auch nicht sonderlich hilfreich. Es ist erstmal absicht, dass die Daten eindimensional vorliegen.

Grüße,
anogayales
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hm, abgesehen davon, dass es scheint, als ob Du x und y in splprep vertauscht hast - kann aber auch Absicht sein - finde ich das jetzt auch nicht besonders logisch. Eigentlich hatte ich mit meinem Link auf die map_coordinates abgezielt - aber das ist auch nicht dasselbe. Das ist u. U. der Moment, wo man besser auf der Mailingliste nachfragt - allerdings solltest Du da direkt sagen, was Du machen willst.

Sorry
Christian
Antworten