用于数组的文件输入输出

NumPy能够读写磁盘上的文本数据或二进制数据。后面的章节将会告诉你一些pandas中用于将表格型数据读取到内存的工具。

将数组以二进制格式保存到磁盘

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的。

  1. In [183]: arr = np.arange(10)
  2.  
  3. In [184]: np.save('some_array', arr)

如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上。然后就可以通过np.load读取磁盘上的数组:

  1. In [185]: np.load('some_array.npy')
  2. Out[185]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

通过np.savez可以将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入即可:

  1. In [186]: np.savez('array_archive.npz', a=arr, b=arr)

加载.npz文件时,你会得到一个类似字典的对象,该对象会对各个数组进行延迟加载:

  1. In [187]: arch = np.load('array_archive.npz')
  2.  
  3. In [188]: arch['b']
  4. Out[188]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

存取文本文件

从文件中加载文本是一个非常标准的任务。Python中的文件读写函数的格式很容易将新手搞晕,所以我将主要介绍pandas中的read_csv和read_table函数。有时,我们需要用np.loadtxt或更为专门化的np.genfromtxt将数据加载到普通的NumPy数组中。

这些函数都有许多选项可供使用:指定各种分隔符、针对特定列的转换器函数、需要跳过的行数等。以一个简单的逗号分隔文件(CSV)为例:

  1. In [191]: !cat array_ex.txt译注3
  2. 0.580052,0.186730,1.040717,1.134411
  3. 0.194163,-0.636917,-0.938659,0.124094
  4. -0.126410,0.268607,-0.695724,0.047428
  5. -1.484413,0.004176,-0.744203,0.005487
  6. 2.302869,0.200131,1.670238,-1.881090
  7. -0.193230,1.047233,0.482803,0.960334

该文件可以被加载到一个二维数组中,如下所示:

  1. In [192]: arr = np.loadtxt('array_ex.txt', delimiter=',')
  2.  
  3. In [193]: arr
  4. Out[193]:
  5. array([[ 0.5801, 0.1867, 1.0407, 1.1344],
  6. [ 0.1942, -0.6369, -0.9387, 0.1241],
  7. [-0.1264, 0.2686, -0.6957, 0.0474],
  8. [-1.4844, 0.0042, -0.7442, 0.0055],
  9. [ 2.3029, 0.2001, 1.6702, -1.8811],
  10. [-0.1932, 1.0472, 0.4828, 0.9603]])

np.savetxt执行的是相反的操作:将数组写到以某种分隔符隔开的文本文件中。genfromtxt跟loadtxt差不多,只不过它面向的是结构化数组和缺失数据处理。更多有关结构化数组的知识,请参阅第12章。

注意: 更多有关文件读写(尤其是表格型数据)的知识,请参阅本书后面有关pandas和DataFrame对象的章节。

译注3:这是Linux的,Windows得用type。