向量化函数

自定义的 sinc 函数:

In [1]:

  1. import numpy as np
  2.  
  3. def sinc(x):
  4. if x == 0.0:
  5. return 1.0
  6. else:
  7. w = np.pi * x
  8. return np.sin(w) / w

作用于单个数值:

In [2]:

  1. sinc(0.0)

Out[2]:

  1. 1.0

In [3]:

  1. sinc(3.0)

Out[3]:

  1. 3.8981718325193755e-17

但这个函数不能作用于数组:

In [4]:

  1. x = np.array([1,2,3])
  2. sinc(x)
  1. ---------------------------------------------------------------------------
  2. ValueError Traceback (most recent call last)
  3. <ipython-input-4-9d4f36f2aa7a> in <module>()
  4. 1 x = np.array([1,2,3])
  5. ----> 2 sinc(x)
  6.  
  7. <ipython-input-1-dffe464e3332> in sinc(x)
  8. 2
  9. 3 def sinc(x):
  10. ----> 4 if x == 0.0:
  11. 5 return 1.0
  12. 6 else:
  13.  
  14. ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

可以使用 numpyvectorize 将函数 sinc 向量化,产生一个新的函数:

In [5]:

  1. vsinc = np.vectorize(sinc)
  2. vsinc(x)

Out[5]:

  1. array([ 3.89817183e-17, -3.89817183e-17, 3.89817183e-17])

其作用是为 x 中的每一个值调用 sinc 函数:

In [6]:

  1. import matplotlib.pyplot as plt
  2. %matplotlib inline
  3.  
  4. x = np.linspace(-5,5,101)
  5. plt.plot(x, vsinc(x))

Out[6]:

  1. [<matplotlib.lines.Line2D at 0xa24e4e0>]

03.14 向量化函数 - 图1

因为这样的用法涉及大量的函数调用,因此,向量化函数的效率并不高。

原文: https://nbviewer.jupyter.org/github/lijin-THU/notes-python/blob/master/03-numpy/03.14-vectorizing-functions.ipynb