J'essaie d'utiliser LinearNDInterpolatorExtrapolate
de scipy.
Le code minimal suivant devrait être aussi simple que possible, mais il renvoie une erreur
TypeError: only integer scalar arrays can be converted to a scalar index
returns
from scipy.interpolate import NearestNDInterpolator points = [[0,0,0], [1,0,0], [1,1,0],[0,1,0],[.5,.5,1]] values = [1,2,3,4,5] interpolator = NearestNDInterpolator(points,values) interpolator([.5,.5,.8])
L'erreur semble provenir de la ligne 81 de scipy.interpolate.ndgriddata [ source ]. Malheureusement, je n'ai pas pu poursuivre l'erreur, car je ne comprends pas ce que tree.query renvoie.
S'agit-il d'un bogue ou je fais quelque chose de mal?
3 Réponses :
Passez simplement les valeurs sans liste sous forme de tuple de valeurs x
answer = list(map(interpolator, [(.5,.5,.8), (.05, 1.6, 2.9)])) # [5, 5]
Si vous souhaitez vous en tenir aux listes de passage, vous pouvez décompresser le contenu de la liste en utilisant * code> as
interpolator(*[.5,.5,.8])
Pour l'interpolation de plusieurs points, vous pouvez mapper
l'interpolateur sur votre liste de points (tuples)
from scipy.interpolate import NearestNDInterpolator points = [[0,0,0], [1,0,0], [1,1,0],[0,1,0],[.5,.5,1]] values = [1,2,3,4,5] interpolator = NearestNDInterpolator(points,values) interpolator((.5,.5,.8)) # 5
Existe-t-il un moyen d'interpoler plus d'un point sans boucle for? Il est assez étrange que NearestNDInterpolator
utilise une syntaxe différente de LinearNDInterpolator
@LucaAmerio: Oui, j'ai ajouté à ma réponse
Passez votre entrée sous forme de tableaux
interpolator([np.array([.5,.5,.8]),np.array([1,1,2])]) >>>> array([5,5])
Vous pouvez même passer de nombreux points:
interpolator = NearestNDInterpolator(np.array(points),np.array( values))
Dans votre cas, cela semble être un problème avec le type de valeur. Étant donné que les premières valeurs de points
et valeurs
sont des entiers de Python, les autres sont interprétées comme des entiers.
Ce qui suit corrige votre code et renvoie une réponse correcte, qui est [5]
:
import numpy as np from scipy.interpolate import NearestNDInterpolator points = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0],[0, 1, 0],[.5, .5, 1]]) values = np.array([1, 2, 3, 4, 5]) interpolator = NearestNDInterpolator(points, values) interpolator(np.array([[.5, .5, .8]])) >>> array([5])
Notez deux choses:
numpy
et utilisé np.array code>. C'est la meilleure façon de travailler avec scipy
, car np.array
, bien que statique, est beaucoup plus rapide par rapport à la liste
de python et fournit un spectre d'opérations mathématiques.
interpolator
, j'ai utilisé [[...]]
au lieu de votre [...]
. Pourquoi? Il met en évidence le fait que NearestNDInterpolator
peut interpoler des valeurs en plusieurs points.
J'ai accepté ta réponse. Ce que je trouve trompeur, cependant, c'est que LinearNDInterpolator
accepte les listes comme entrées, alors que NearestNDInterpolator
ne le fait pas. Cependant, l'erreur était plus triviale que ce à quoi je m'attendais. Merci beaucoup
@LucaAmerio: C'est une bonne pratique éthique non seulement d'accepter la meilleure réponse, mais aussi de la voter et d'autres, si vous les trouvez utiles. Veuillez lire Que dois-je faire lorsque quelqu'un répond à ma question?