web-dev-qa-db-fra.com

Python 'AttributeError: l'objet' fonction 'n'a pas d'attribut' min ''

Tout d’abord, nous nous excusons de l’apparence évidente de ces deux questions; Je suis très novice dans ce domaine et je n'ai aucune idée de ce que je fais.

J'essaie d'écrire quelque chose pour appliquer la fonction Scipy pour l'interpolation spline à un tableau de valeurs. Mon code ressemble actuellement à ceci:

import numpy as np
import scipy as sp
from scipy.interpolate import interp1d

x=var
x1 = ([0.1,0.3,0.4])
y1 = [0.2,0.5,0.6]

new_length = 25
new_x = np.linspace(x.min(), x.max(), new_length)
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x)

mais quand il arrive à la ligne

new_x = np.linspace(x.min(), x.max(), new_length)

Je reçois l'erreur suivante:

AttributeError: 'function' object has no attribute 'min'

et jusqu'à présent, googler, etc. n'a rien révélé que je comprenne. Qu'est-ce que cela signifie et comment puis-je résoudre le problème?

Deuxième question: comment saisir plus d'une ligne de code à la fois? Pour le moment, si j'essaie de copier tout le contenu, puis de le coller dans PyLab, il ne saisit que la première ligne de mon code. Je dois donc coller le tout dans une ligne à la fois. Comment puis-je résoudre ce problème?

10
Tom Robinson

Si cette ligne

new_x = np.linspace(x.min(), x.max(), new_length)

génère le message d'erreur

AttributeError: 'function' object has no attribute 'min'

alors x est une fonction et les fonctions (en général) n'ont pas d'attributs min, vous ne pouvez donc pas appeler some_function.min(). Qu'est-ce que x? Dans votre code, vous ne l'avez défini que comme 

x=var

Je ne suis pas sûr de ce que var est. var n'est pas une fonction intégrée par défaut à Python, mais si c'est une fonction, vous l'avez définie vous-même pour une raison quelconque ou vous l'avez récupérée quelque part (par exemple, vous utilisez Sage ou vous avez importé une étoile comme from sympy import * ou quelque chose.)

[Mise à jour: puisque vous dites que vous utilisez "PyLab", var est probablement numpy.var qui a été importé dans scope au démarrage sous IPython. Je pense que vous voulez vraiment dire "utiliser IPython en mode --pylab.]

Vous définissez également x1 et y1, mais ensuite votre code ultérieur fait référence à x et y, ce qui donne l'impression que ce code est à mi-chemin entre deux états fonctionnels.

Maintenant, numpy arrays do a une méthode .min() et .max(), donc ceci:

>>> x = np.array([0.1, 0.3, 0.4, 0.7])
>>> y = np.array([0.2, 0.5, 0.6, 0.9])
>>> new_length = 25
>>> new_x = np.linspace(x.min(), x.max(), new_length)
>>> new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x)

travaillerait. Vos données de test ne le seront pas car l’interpolation nécessite au moins 4 points, et vous obtiendrez

ValueError: x and y arrays must have at least 4 entries
9
DSM

Deuxième question: comment saisir plus d'une ligne de code à la fois? Pour le moment, si j'essaie de copier tout le contenu, puis de le coller dans PyLab, il ne saisit que la première ligne de mon code. Je dois donc coller le tout dans une ligne à la fois. Comment puis-je résoudre ce problème?

En supposant que vous êtes dans ipython appelé ipython --pylab ou quelque chose de similaire, vous pouvez simplement utiliser la commande magique paste . Appelez-le en tant que %paste ou simplement paste si vous n'avez pas défini paste en tant que autre variable:

In [8]: paste
import numpy as np
import scipy as sp
from scipy.interpolate import interp1d

x=var
x1 = ([0.1,0.3,0.4])
y1 = [0.2,0.5,0.6]

new_length = 25
new_x = np.linspace(x.min(), x.max(), new_length)
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x)

## -- End pasted text --
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-8-b4e41f59d719> in <module>()
      3 from scipy.interpolate import interp1d
      4 
----> 5 x=var
      6 x1 = ([0.1,0.3,0.4])
      7 y1 = [0.2,0.5,0.6]

NameError: name 'var' is not defined

In [9]: 
3
askewchan

Changez cette ligne en:

new_x = np.linspace(min(x), max(x), new_length)

min et max ne sont pas des attributs de listes, ce sont leurs propres fonctions.

2
Inbar Rose

J'ai rencontré une erreur similaire lorsque j'ai appelé timezone.now au lieu de timezone.now(). J'ai ensuite essayé de formater la valeur DateTime que j'attendais. Mais ce n'était pas une DateTime; c'était une fonction. Cela a entraîné un message d'erreur indiquant que «Mois» n'est pas un attribut de «fonction».

Le correctif consistait simplement à ajouter les parenthèses après now. Ceci a appelé la fonction now et a renvoyé son résultat, au lieu de renvoyer l'objet now function lui-même.

Erreur stupide, je sais. Mais pas facile à dépanner.

0
Stephen G Tuggy