J'utilise curve_fit de scipy pour adapter une fonction à certaines données et recevoir l'erreur suivante;
Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
ce qui me pointe vers cette ligne dans mon code;
popt_r, pcov = curve_fit(
self.rightFunc, np.array(wavelength)[beg:end][edgeIndex+30:],
np.dstack(transmitted[:,:,c][edgeIndex+30:])[0][0],
p0=[self.m_right, self.a_right])
rightFunc est défini comme suit;
def rightFunc(self, x, m, const):
return np.exp(-(m*x + const))
Si je comprends bien, le type 'O' fait référence à un objet python, mais je ne peux pas voir la cause de cette erreur.
Erreur complète:
Des idées sur ce que je devrais explorer pour aller au fond des choses?
Ces fonctions scipy
nécessitent généralement des paramètres tels que:
curvefit( function, initial_values, (aux_values,), ...)
où le tuple de aux_values
est transmis à votre function
avec la valeur actuelle de la variable principale.
L'expression dstack
est-elle aux_values
? Ou une concaténation de plusieurs. Il faudra peut-être le placer dans une Tuple
.
(np.dstack(transmitted[:,:,c][edgeIndex+30:])[0][0],)
Nous aurons peut-être besoin de savoir exactement où cette erreur se produit et pas seulement la ligne de votre code qui la génère. Nous devons savoir quelle valeur est convertie. Où se trouve un tableau avec un objet dtype?
Juste au cas où cela pourrait aider quelqu'un d'autre, j'ai utilisé numpy.array(wavelength,dtype='float64')
pour forcer la conversion des objets de la liste en float64. Fonctionne bien pour moi.
De ici , apparemment, numpy se débat avec le type d’index. La solution proposée est:
Une chose que vous pouvez faire est d’utiliser np.intp en tant que type à chaque fois que des opérations d’indexation ou liées logiquement à l’indexation/la taille des tableaux sont liées. C'est le type naturel pour cela et ce sera normalement aussi le plus rapide.
Est-ce que cela aide?
Juste pour clarifier, j'ai eu le même problème, je n'ai pas vu les bonnes réponses dans les commentaires, avant de le résoudre moi-même. Donc je les répète ici:
J'ai résolu le problème. Je passais un tableau avec un élément à la liste p0, plutôt que l'élément lui-même. Merci pour votre aide - Jacobadtr 12 sept. À 17:51
Un type O résulte souvent lors de la construction d'un tableau à partir d'une liste de sous-listes de taille différente. Si np.array (...) ne peut pas créer un tableau de nombres n-d propre, il recourt à un tableau d'objets. - hpaulj le 12 septembre à 17h15
En d’autres termes, assurez-vous que le tuple de paramètres que vous transmettez à curve_fit puisse être correctement converti en un tableau numpy