以下语法非常直观。在Spyder中运行,它绘制了一个非线性函数。
import numpy as numpy
import matplotlib.pyplot as plot
x = numpy.arange(0, 1, 0.01)
def nonlinear(x, deriv=False): #sigmoid
if (deriv==True):
return x*(1-x)
return 1/(1-numpy.exp(-x))
plot.plot(x, nonlinear(x))
我的问题是,如何是传递给nonlinear
的函数plot.plot
?这是一个lambda? nonlinear
如何在数学运算时接受数组而不会崩溃?
答案 0 :(得分:3)
它工作正常,因为通常的算术运算(例如你使用的/
和-
)是为numpy数组定义的;他们只是按照元素执行。 np.exp()
也是如此。你可以确切地看到nonlinear(x)
对你自己来说是什么样的(它也是一个numpy数组):
>>> import numpy as np
>>> def nonlinear(x): return 1/(1 + np.exp(-x))
...
>>> nonlinear(np.arange(0, 1, 0.1))
array([ 0.5 , 0.52497919, 0.549834 , 0.57444252, 0.59868766,
0.62245933, 0.64565631, 0.66818777, 0.68997448, 0.7109495 ])
您只是找到在指定范围内的每个点评估的sigmoid的值,并将这些值作为y值传递给plot
。
答案 1 :(得分:1)
Python有特殊的双下划线方法。例如__add__
,__sub__
等https://docs.python.org/2/reference/datamodel.html有更全面的列表。
x + y只是x.__add__(y)
x * y只是x.__mul__(y)
Numpy利用这些“神奇”方法来实现逐点算术
答案 2 :(得分:1)
matplotlib plot
函数需要两个列表(或numpy数组)作为x和y的参数。正如arshajii所回答的那样,语法是vaild,因为numpy数组x
在nonlinear
函数的return语句中以元素方式进行求值(这非常好)。
然而,如果非线性函数包括逐个案例的操作,则不再可能进行numpy评估(没有一些进一步的numpy-magic)。例如,看看这种连续可微分但非平滑的功能:
from pylab import *
def nonlinear(x, x0=2):
return x**2 if x < x0 else 2*x0*(x - x0) + x0**2
x = linspace(0, 5, 100)
y = nonlinear(x)
最后一行出现错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
而是使用列表理解
y = [nonlinear(x_, x0=2.5) for x_ in x]
plot(x, y)
show()