1.3.4. 高级操作

1.3.4.1. 多项式

NumPy还包含不同bases的多项式:

例如,3x^2 + 2x - 1

>>> p = np.poly1d([3, 2, -1])
>>> p(0)
-1
>>> p.roots
array([-1. , 0.33333333])
>>> p.order
2
>>> x = np.linspace(0, 1, 20)
>>> y = np.cos(x) + 0.3*np.random.rand(20)
>>> p = np.poly1d(np.polyfit(x, y, 3))
>>> t = np.linspace(0, 1, 200)
>>> plt.plot(x, y, 'o', t, p(t), '-')
[<matplotlib.lines.Line2D object at ...>, <matplotlib.lines.Line2D object at ...>]

[源代码hires.pngpdf]

../../_images/numpy_intro_9.png

有关详情,请参见http://docs.scipy.org/doc/numpy/reference/routines.polynomials.poly1d.html

1.3.4.1.1. 更多的多项式(具有更多的bases)

NumPy还有一个更复杂的多项式接口,它支持例如Chebyshev basis。

3x^2 + 2x - 1

>>> p = np.polynomial.Polynomial([-1, 2, 3]) # coefs in different order!
>>> p(0)
-1.0
>>> p.roots()
array([-1. , 0.33333333])
>>> p.degree() # In general polynomials do not always expose 'order'
2

在Chebyshev basis中使用多项式的示例,多项式的范围为[-1, 1]

>>> x = np.linspace(-1, 1, 2000)
>>> y = np.cos(x) + 0.3*np.random.rand(2000)
>>> p = np.polynomial.Chebyshev.fit(x, y, 90)
>>> t = np.linspace(-1, 1, 200)
>>> plt.plot(x, y, 'r.')
[<matplotlib.lines.Line2D object at ...>]
>>> plt.plot(t, p(t), 'k-', lw=3)
[<matplotlib.lines.Line2D object at ...>]

[源代码hires.pngpdf]

../../_images/numpy_intro_10.png

切比雪夫多项式在插值中具有一些优点。

1.3.4.2. 加载数据文件

1.3.4.2.1. 文本文件

示例:populations.txt

# year  hare    lynx    carrot
1900    30e3    4e3     48300
1901    47.2e3  6.1e3   48200
1902    70.2e3  9.8e3   41500
1903    77.4e3  35.2e3  38200

>>> data = np.loadtxt('data/populations.txt')
>>> data
array([[ 1900., 30000., 4000., 48300.],
[ 1901., 47200., 6100., 48200.],
[ 1902., 70200., 9800., 41500.],
...
>>> np.savetxt('pop2.txt', data)
>>> data2 = np.loadtxt('pop2.txt')

注意

如果你有一个复杂的文本文件,你可以尝试:

  • np.genfromtxt
  • 使用Python的I/O函数和正则表达式解析(Python非常适合这个)

提醒:使用IPython浏览文件系统

In [1]: pwd      # show current directory
'/home/user/stuff/2011-numpy-tutorial'
In [2]: cd ex
'/home/user/stuff/2011-numpy-tutorial/ex'
In [3]: ls
populations.txt species.txt

1.3.4.2.2. 图片

使用Matplotlib:

>>> img = plt.imread('data/elephant.png')
>>> img.shape, img.dtype
((200, 300, 3), dtype('float32'))
>>> plt.imshow(img)
<matplotlib.image.AxesImage object at ...>
>>> plt.savefig('plot.png')
>>> plt.imsave('red_elephant', img[:,:,0], cmap=plt.cm.gray)

这仅保存了一个(RGB)通道:

>>> plt.imshow(plt.imread('red_elephant.png'))  
<matplotlib.image.AxesImage object at ...>

其他库:

>>> from scipy.misc import imsave
>>> imsave('tiny_elephant.png', img[::6,::6])
>>> plt.imshow(plt.imread('tiny_elephant.png'), interpolation='nearest')
<matplotlib.image.AxesImage object at ...>

[源代码]

../../_images/numpy_intro_3.png

1.3.4.2.3. NumPy自己的格式

NumPy有自己的二进制格式,不可移植但具有高效的I/O:

>>> data = np.ones((3, 3))
>>> np.save('pop.npy', data)
>>> data3 = np.load('pop.npy')

1.3.4.2.4. 众所周知(和鲜为人知)的文件格式

  • HDF5:h5pyPyTables
  • NetCDF:scipy.io.netcdf_filenetcdf4-python,...
  • Matlab:scipy.io.loadmatscipy.io.savemat
  • MatrixMarket:scipy.io.mmreadscipy.io.mmwrite
  • IDL:scipy.io.readsav

...如果有人使用它,可能还有一个Python库。

练习:文本数据文件

编写一个Python脚本,从populations.txt加载数据,并丢弃最后一列和前5行。将较小的数据集保存到pop2.txt

NumPy内部

如果你对NumPy内部感兴趣,在Advanced NumPy中有一个很好的讨论。