向量化函数
自定义的 sinc
函数:
In [1]:
- import numpy as np
- def sinc(x):
- if x == 0.0:
- return 1.0
- else:
- w = np.pi * x
- return np.sin(w) / w
作用于单个数值:
In [2]:
- sinc(0.0)
Out[2]:
- 1.0
In [3]:
- sinc(3.0)
Out[3]:
- 3.8981718325193755e-17
但这个函数不能作用于数组:
In [4]:
- x = np.array([1,2,3])
- sinc(x)
- ---------------------------------------------------------------------------
- ValueError Traceback (most recent call last)
- <ipython-input-4-9d4f36f2aa7a> in <module>()
- 1 x = np.array([1,2,3])
- ----> 2 sinc(x)
- <ipython-input-1-dffe464e3332> in sinc(x)
- 2
- 3 def sinc(x):
- ----> 4 if x == 0.0:
- 5 return 1.0
- 6 else:
- ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
可以使用 numpy
的 vectorize
将函数 sinc
向量化,产生一个新的函数:
In [5]:
- vsinc = np.vectorize(sinc)
- vsinc(x)
Out[5]:
- array([ 3.89817183e-17, -3.89817183e-17, 3.89817183e-17])
其作用是为 x
中的每一个值调用 sinc
函数:
In [6]:
- import matplotlib.pyplot as plt
- %matplotlib inline
- x = np.linspace(-5,5,101)
- plt.plot(x, vsinc(x))
Out[6]:
- [<matplotlib.lines.Line2D at 0xa24e4e0>]
因为这样的用法涉及大量的函数调用,因此,向量化函数的效率并不高。