2017-12-20 21 views
1

Ich habe einige Daten, die in der Form (x, y, z, V) wo x, y, z Entfernungen sind, und V ist die Feuchtigkeit. Ich lese viel über StackOverflow über Interpolation von Python wie this und this wertvolle Beiträge, aber alle von ihnen waren über regelmäßige Raster von x, y, z. d.h. jeder Wert von x trägt gleichermaßen zu jedem Punkt von y und jedem Punkt von z bei. Auf der anderen Seite kamen meine Punkte aus 3D-Finite-Elemente-Gitter (wie unten), wo das Gitter nicht regelmäßig ist.4D-Interpolation für unregelmäßige (x, y, z) -Gitter von Python

enter image description here

Die beiden genannten Stellen 1 und 2, jedes von x, y, z als separate numpy Array definiert dann verwendet sie so etwas wie cartcoord = zip(x, y)scipy.interpolate.LinearNDInterpolator(cartcoord, z) dann (in einem 3D-Beispiel). Ich kann nicht dasselbe tun, da mein 3D-Gitter nicht regelmäßig ist, daher hat nicht jeder Punkt einen Beitrag zu anderen Punkten. Wenn ich diese Ansätze wiederholt habe, habe ich viele Nullwerte gefunden und viele Fehler bekommen.

Hier sind 10 Abtastpunkte in Form von [x, y, z, V]

data = [[27.827, 18.530, -30.417, 0.205] , [24.002, 17.759, -24.782, 0.197] , 
[22.145, 13.687, -33.282, 0.204] , [17.627, 18.224, -25.197, 0.197] , 
[29.018, 18.841, -38.761, 0.212] , [24.834, 20.538, -33.012, 0.208] , 
[26.232, 22.327, -27.735, 0.204] , [23.017, 23.037, -29.230, 0.205] , 
[28.761, 21.565, -31.586, 0.211] , [26.263, 23.686, -32.766, 0.215]] 

Ich möchte den interpolierten Wert V des Punktes bekommen (25, 20, -30)

Wie kann ich es bekommen?

Antwort

3

Ich fand die Antwort und posten es für StackOverflow-Leser.

Das Verfahren ist wie folgt:

1- Importe:

import numpy as np 
from scipy.interpolate import griddata 
from scipy.interpolate import LinearNDInterpolator 

2- die Daten vorbereitet, wie folgt:

# put the available x,y,z data as a numpy array 
points = np.array([ 
     [ 27.827, 18.53 , -30.417], [ 24.002, 17.759, -24.782], 
     [ 22.145, 13.687, -33.282], [ 17.627, 18.224, -25.197], 
     [ 29.018, 18.841, -38.761], [ 24.834, 20.538, -33.012], 
     [ 26.232, 22.327, -27.735], [ 23.017, 23.037, -29.23 ], 
     [ 28.761, 21.565, -31.586], [ 26.263, 23.686, -32.766]]) 
# and put the moisture corresponding data values in a separate array: 
values = np.array([0.205, 0.197, 0.204, 0.197, 0.212, 
        0.208, 0.204, 0.205, 0.211, 0.215]) 
# Finally, put the desired point/points you want to interpolate over 
request = np.array([[25, 20, -30], [27, 20, -32]]) 

3- die letzte Zeile Code schreiben zu bekommen die interpolierten Werte

Methode 1, usi ng griddata

print griddata(points, values, request) 
# OUTPUT: array([ 0.20448536, 0.20782028]) 

Methode 2 unter Verwendung LinearNDInterpolator

# First, define an interpolator function 
linInter= LinearNDInterpolator(points, values) 

# Then, apply the function to one or more points 
print linInter(np.array([[25, 20, -30]])) 
print linInter(xi) 
# OUTPUT: [0.20448536 0.20782028] 
# I think you may use it with python map or pandas.apply as well 

Hoffnung dieser Vorteil jeden.

Mit freundlichen Grüßen

Verwandte Themen