1.3.4.2 加载数据文件

1.3.4.2.1 文本文件

例子: populations.txt:

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

In [222]:

  1. data = np.loadtxt('data/populations.txt')
  2. data

Out[222]:

  1. array([[ 1900., 30000., 4000., 48300.],
  2. [ 1901., 47200., 6100., 48200.],
  3. [ 1902., 70200., 9800., 41500.],
  4. [ 1903., 77400., 35200., 38200.],
  5. [ 1904., 36300., 59400., 40600.],
  6. [ 1905., 20600., 41700., 39800.],
  7. [ 1906., 18100., 19000., 38600.],
  8. [ 1907., 21400., 13000., 42300.],
  9. [ 1908., 22000., 8300., 44500.],
  10. [ 1909., 25400., 9100., 42100.],
  11. [ 1910., 27100., 7400., 46000.],
  12. [ 1911., 40300., 8000., 46800.],
  13. [ 1912., 57000., 12300., 43800.],
  14. [ 1913., 76600., 19500., 40900.],
  15. [ 1914., 52300., 45700., 39400.],
  16. [ 1915., 19500., 51100., 39000.],
  17. [ 1916., 11200., 29700., 36700.],
  18. [ 1917., 7600., 15800., 41800.],
  19. [ 1918., 14600., 9700., 43300.],
  20. [ 1919., 16200., 10100., 41300.],
  21. [ 1920., 24700., 8600., 47300.]])

In [224]:

  1. np.savetxt('pop2.txt', data)
  2. data2 = np.loadtxt('pop2.txt')

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

  • np.genfromtxt
  • 使用Python的I/O函数和例如正则式来解析(Python特别适合这个工作)

提示:用IPython在文件系统中航行

In [225]:

  1. pwd # 显示当前目录

Out[225]:

  1. u'/Users/cloga/Documents/scipy-lecture-notes_cn'

In [227]:

  1. cd data
  1. /Users/cloga/Documents/scipy-lecture-notes_cn/data

In [228]:

  1. ls
  1. populations.txt

1.3.4.2.2 图像

使用Matplotlib:

In [233]:

  1. img = plt.imread('data/elephant.png')
  2. img.shape, img.dtype

Out[233]:

  1. ((200, 300, 3), dtype('float32'))

In [234]:

  1. plt.imshow(img)

Out[234]:

  1. <matplotlib.image.AxesImage at 0x10fd13f10>

1.3.4.2 加载数据文件 - 图1

In [237]:

  1. plt.savefig('plot.png')
  2. plt.imsave('red_elephant', img[:,:,0], cmap=plt.cm.gray)
  1. <matplotlib.figure.Figure at 0x10fba1750>

这只保存了一个渠道(RGB):

In [238]:

  1. plt.imshow(plt.imread('red_elephant.png'))

Out[238]:

  1. <matplotlib.image.AxesImage at 0x11040e150>

1.3.4.2 加载数据文件 - 图2

其他包:

In [239]:

  1. from scipy.misc import imsave
  2. imsave('tiny_elephant.png', img[::6,::6])
  3. plt.imshow(plt.imread('tiny_elephant.png'), interpolation='nearest')

Out[239]:

  1. <matplotlib.image.AxesImage at 0x110bfbfd0>

1.3.4.2 加载数据文件 - 图3

1.3.4.2.3 Numpy的自有格式

Numpy有自有的二进制格式,没有便携性但是I/O高效:

In [240]:

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

1.3.4.2.4 知名的(并且更复杂的)文件格式

  • HDF5: h5py, PyTables
  • NetCDF: scipy.io.netcdf_file, netcdf4-python, …
  • Matlab: scipy.io.loadmat, scipy.io.savemat
  • MatrixMarket: scipy.io.mmread, scipy.io.mmread

… 如果有人使用,那么就可能有一个对应的Python库。

练习:文本数据文件

写一个Python脚本从populations.txt加载数据,删除前五行和后五行。将这个小数据集存入 pop2.txt

Numpy内部

如果你对Numpy的内部感兴趣, 有一个关于Advanced Numpy的很好的讨论。