矢量化函数(Python)

use*_*099 4 python scalar numpy vectorization scipy

我是python的新手,并尝试进行硬件分配,它不断向我发送此错误(在iPython Notebook中):

"TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'float'"
Run Code Online (Sandbox Code Playgroud)

这是我试图模仿的公式: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)
Run Code Online (Sandbox Code Playgroud)

我正试着和老师一样出局.

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]
Run Code Online (Sandbox Code Playgroud)

这是老师问题btw:

首先,编写一个名为h_scalar的函数.该函数应该期望一个列表(或者通常是一个可迭代的项).它期望列表包含浮点值.它应返回一个新的浮点列表,它是输入列表中每个x值的h(x).你应该命名你的函数h_scalar()

Sau*_*tro 6

你会使用达到更好的性能numpysqrtexp,这将操作的elementwise:

import numpy as np
from numpy import sqrt, exp, pi
def h_scalar(x):
    x = np.array(x)
    return (1/sqrt(2*pi)) * exp(-0.50*x**2)
Run Code Online (Sandbox Code Playgroud)

您可以像以下一样使用它:

x = [-10.0, -1.0, 0.0, 1.0, 10.0]
h_scalar(x)
Run Code Online (Sandbox Code Playgroud)


jab*_*edo 5

如果您想使用numpy.vectorize这是一种选择:

>>> import numpy as np
>>> h_scalar = np.vectorize(lambda x: (1 / np.sqrt(2 * np.pi)) * np.exp( -.50** x ** 2.00 ))
>>> l = np.array([-10.0, -1.0, 0.0, 1.0, 10.0])
>>> h_scalar(l)
Run Code Online (Sandbox Code Playgroud)

  • 请记住,与简单的列表理解相比,`np.vectorize` 并没有真正带来任何性能优势 - 您最终仍然会在 Python 而不是 C 中循环 (3认同)

svk*_*svk 0

要对列表(或另一个可迭代对象)中的所有项目执行操作,从操作的返回值创建一个新列表,您可以执行以下操作:

>>> l = [1,2,3,4,5]
>>> l2 = [ 2 * x for x in l ]
>>> print l2
[2, 4, 6, 8, 10]
Run Code Online (Sandbox Code Playgroud)

这里第二行使用的 Python 语言功能称为列表理解,它非常适合您布置的家庭作业。