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?
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
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]:
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.
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.