1
votes

LinearNDInterpolatorExtrapolate renvoie une erreur avec un exemple trivial

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?


0 commentaires

3 Réponses :


1
votes

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


2 commentaires

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



1
votes

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))


0 commentaires

1
votes

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:

  • J'ai importé 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.
  • Lors de l'appel de interpolator , j'ai utilisé [[...]] au lieu de votre [...] . Pourquoi? Il met en évidence le fait que NearestNDInterpolator peut interpoler des valeurs en plusieurs points.


2 commentaires

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?