La procédure suivante permet d'obtenir des valeurs qui ne correspondent pas toujours à celles qui ont été attribuées :
from scipy.interpolate import splprep, splev, splrep
import numpy as np
pos2indx = lambda vec: vec.round().astype(np.int64)
t = np.linspace(1,3,150)
x = 150+100*np.sin(t) + 5*np.random.randn(len(t))
y = 150+100*np.cos(t) + 5*np.random.randn(len(t))
z = 150+100*np.cos(t)*np.sin(t) + 5*np.random.randn(len(t))
vector_field = np.zeros((x.max()+10,y.max()+10,z.max()+10,3), dtype=np.float64)
out = splprep([x,y,z],u=t,k=3, full_output=1, quiet=1)
tck, t = out[0]
v = np.transpose(splev(t,tck, der=1))
i,j,k = pos2indx(x),pos2indx(y),pos2indx(z)
vector_field[i,j,k,:] += v
print np.sum(np.abs(vector_field[i,j,k,:]-v))
Je m'attendais à ce que cette procédure imprime toujours zéro. Cependant, il arrive que ce ne soit pas le cas ! Lorsque la sortie est non nulle, elle est de plusieurs milliers.
Je ne sais pas si je fais quelque chose de mal ou s'il y a un bug.
Je l'ai signalé comme un problème de Scipy aussi.
solution :
Pauli Virtanen : "Le bug est dans votre code : les vecteurs i,j,k peuvent contenir deux fois une paire de coordonnées donnée." ( https://github.com/scipy/scipy/issues/2581 )
jorgeca a posté une réponse similaire ci-dessous.
Gracias.