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
In [222]:
data = np.loadtxt('data/populations.txt')
data
Out[222]:
array([[ 1900., 30000., 4000., 48300.],
[ 1901., 47200., 6100., 48200.],
[ 1902., 70200., 9800., 41500.],
[ 1903., 77400., 35200., 38200.],
[ 1904., 36300., 59400., 40600.],
[ 1905., 20600., 41700., 39800.],
[ 1906., 18100., 19000., 38600.],
[ 1907., 21400., 13000., 42300.],
[ 1908., 22000., 8300., 44500.],
[ 1909., 25400., 9100., 42100.],
[ 1910., 27100., 7400., 46000.],
[ 1911., 40300., 8000., 46800.],
[ 1912., 57000., 12300., 43800.],
[ 1913., 76600., 19500., 40900.],
[ 1914., 52300., 45700., 39400.],
[ 1915., 19500., 51100., 39000.],
[ 1916., 11200., 29700., 36700.],
[ 1917., 7600., 15800., 41800.],
[ 1918., 14600., 9700., 43300.],
[ 1919., 16200., 10100., 41300.],
[ 1920., 24700., 8600., 47300.]])
In [224]:
np.savetxt('pop2.txt', data)
data2 = np.loadtxt('pop2.txt')
注:如果你有一个复杂的文本文件,应该尝试:
np.genfromtxt
- 使用Python的I/O函数和例如正则式来解析(Python特别适合这个工作)
提示:用IPython在文件系统中航行
In [225]:
pwd # 显示当前目录
Out[225]:
u'/Users/cloga/Documents/scipy-lecture-notes_cn'
In [227]:
cd data
/Users/cloga/Documents/scipy-lecture-notes_cn/data
In [228]:
ls
populations.txt
1.3.4.2.2 图像
使用Matplotlib:
In [233]:
img = plt.imread('data/elephant.png')
img.shape, img.dtype
Out[233]:
((200, 300, 3), dtype('float32'))
In [234]:
plt.imshow(img)
Out[234]:
<matplotlib.image.AxesImage at 0x10fd13f10>
In [237]:
plt.savefig('plot.png')
plt.imsave('red_elephant', img[:,:,0], cmap=plt.cm.gray)
<matplotlib.figure.Figure at 0x10fba1750>
这只保存了一个渠道(RGB):
In [238]:
plt.imshow(plt.imread('red_elephant.png'))
Out[238]:
<matplotlib.image.AxesImage at 0x11040e150>
其他包:
In [239]:
from scipy.misc import imsave
imsave('tiny_elephant.png', img[::6,::6])
plt.imshow(plt.imread('tiny_elephant.png'), interpolation='nearest')
Out[239]:
<matplotlib.image.AxesImage at 0x110bfbfd0>
1.3.4.2.3 Numpy的自有格式
Numpy有自有的二进制格式,没有便携性但是I/O高效:
In [240]:
data = np.ones((3, 3))
np.save('pop.npy', data)
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的很好的讨论。