Vectorisation d'une fonction (Python)
Je suis nouveau sur python et en essayant de faire une tache HW et il ne cesse de jeter cette erreur de retour chez moi (dans iPython Notebook):
"TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'float'"
Voici la formule que je suis en train de l'imiter: h(x)=(1/√2π)*e^−(1/2)^x^2
import numpy as np
import math
from math import *
def h_scalar(x):
return (1 / sqrt(2 * pi)) * exp(-.50** x ** 2.00)
Que j'essaie de faire la même sortie que mon professeur.
l = [-10.0, -1.0, 0.0, 1.0, 10.0] #
print h_scalar(l)
>>> [1.4867195147342977e-06, 0.24197072451914337, 0.3989422804014327,
0.24197072451914337, 1.4867195147342977e-06]
Voici les enseignants à la question btw:
Tout d'abord, écrire une fonction nommée h_scalar. La fonction doit s'attendre à une liste (ou en général un élément qui est itératif). Il s'attend à ce que la liste contient les valeurs à virgule flottante. Elle doit retourner une nouvelle liste de flotteurs qui sont les h(x) pour chaque valeur de x dans la liste d'entrée. Vous devez appeler votre fonction h_scalar()
-.50 * x ** 2.00
. 2.) Vous ne pouvez pas diffuser une opération comme **2.00
à travers un standard de python tableau. Pour ce faire, convertir x
à un np.array
. 3.) Si vous ne souhaitez pas utiliser numpy, pensez à utiliser un for
boucle pour calculer la formule pour chaque élément dans x
. Stocker ces valeurs dans un autre tableau, ce qui permet ensuite de retour. Sinon, utilisez une compréhension de liste.
OriginalL'auteur user2839099 | 2013-10-02
Vous devez vous connecter pour publier un commentaire.
Vous permettra d'atteindre une meilleure performance à l'aide de
numpy
'ssqrt
etexp
, qui fonctionnera elementwise:Vous pouvez l'utiliser comme:
Pour répondre aux exigences de l'entrée d'une liste (ou tout objet iterable), vous devez insérer
x=np.array(x, copy=False)
comme la première ligne de la fonctionh_scalar
.merci!!!! Je n'ai pas prêté assez d'attention à cette exigence! Dans ce cas, je pense que vous ne pouvez pas éviter la copie...
OriginalL'auteur Saullo G. P. Castro
Si vous souhaitez utiliser
numpy.vectorize
c'est une option:np.vectorize
n'a pas vraiment d'avantage de performances sur une simple liste de compréhension - vous aurez toujours la fin de la boucle dans Python plutôt que de COriginalL'auteur jabaldonedo
Ce que vous voulez est compréhension de liste.
Comme ceci:
OriginalL'auteur Piotr Lopusiewicz
Pour effectuer une opération sur tous les éléments d'une liste (ou un autre objet itérable), la création d'une nouvelle liste à partir des valeurs de retour de l'opération, vous pouvez faire quelque chose comme ceci:
Le Python, le langage utilisé sur la deuxième ligne est appelé un compréhension de liste, et c'est très bien adapté pour le devoir que vous avez été donné.
OriginalL'auteur svk
vous essayez d'utiliser l'alimentation sur une liste plutôt que d'un élément de liste. J'ai peut-être la fonction exacte de mal ici, mais essayez quelque chose comme cela pour prendre une liste et retourne une liste.
Je ne suis pas sûr que vous avez le droit de l'équation cependant, pourriez-vous re-formater?
compréhension de liste comme la svk et Piotr souligné, c'est une façon d'aller. Comme je l'ai dit, vous aurez envie de vérifier votre équation, mais je ne peux pas dire à partir de votre mise en forme de ce que vous essayez d'obtenir.
Est-ce à ressembler à votre équation d'origine: lien
OriginalL'auteur Garth5689