web-dev-qa-db-fra.com

Impossible de convertir les données d'un tableau à partir de dtype ('O') en dtype ('float64')

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:

 Image detailing the error received

Des idées sur ce que je devrais explorer pour aller au fond des choses?

4
jm22b

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?

2
hpaulj

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.

2
Adrine Correya

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?

0
NickBraunagel

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

0
MHO