您将学到什么¶
您将把NumPy数组保存为压缩文件和人类可读的逗号分隔文件,即*.csv。您还将学习如何将这两种文件类型加载回NumPy工作区。
您将做什么¶
您将学习两种保存和读取文件的方式——压缩文件和文本文件——这将满足您在NumPy中的大部分存储需求。
您将创建两个一维数组和一个二维数组
您将把这些数组保存到文件中
您将从工作区中删除变量
您将从保存的文件中加载变量
您将比较压缩的二进制文件和人类可读的 것입니다分隔文件
您将掌握保存、加载和共享NumPy数组的技能
您将需要什么¶
NumPy
对您的工作目录的读写访问
使用以下命令加载必要的函数。
import numpy as np在本教程中,您将使用以下Python、IPython magic和NumPy函数
创建您的数组¶
现在您已经导入了NumPy库,您可以创建几个数组;让我们从两个一维数组x和y开始,其中y = x**2。您将使用 np.arange 将x赋值为0到9的整数。
x = np.arange(10)
y = x ** 2
print(x)
print(y)[0 1 2 3 4 5 6 7 8 9]
[ 0 1 4 9 16 25 36 49 64 81]
使用NumPy的 savez 保存您的数组¶
现在您的工作区中有两个数组,
x: [0 1 2 3 4 5 6 7 8 9]
y: [ 0 1 4 9 16 25 36 49 64 81]
您将首先使用 savez 将它们作为压缩数组保存到文件中。您将使用两个选项来标记文件中的数组,
x_axis = x:此选项将名称x_axis赋值给变量xy_axis = y:此选项将名称y_axis赋值给变量y
np.savez("x_y-squared.npz", x_axis=x, y_axis=y)删除已保存的数组并使用NumPy的 load 加载它们¶
在您当前的目录中,应该有一个名为x_y-squared.npz的新文件。该文件是两个数组x和y的压缩二进制文件。让我们清除工作区并将值加载回来。这个x_y-squared.npz文件包含两个 NPY格式 文件。NPY格式是一种 原生二进制格式。您无法在标准文本编辑器或电子表格中读取数字。
要查看工作区中有哪些变量,请使用Jupyter/IPython的“magic”命令 whos。
del x, y%whosVariable Type Data/Info
------------------------------
np module <module 'numpy' from '/ho<...>kages/numpy/__init__.py'>
load_xy = np.load("x_y-squared.npz")
print(load_xy.files)['x_axis', 'y_axis']
%whosVariable Type Data/Info
-------------------------------
load_xy NpzFile NpzFile 'x_y-squared.npz'<...>with keys: x_axis, y_axis
np module <module 'numpy' from '/ho<...>kages/numpy/__init__.py'>
将NpzFile数组重新赋值给x和y¶
您现在已经创建了一个NpzFile类型的字典。包含的文件是您在savez命令中定义的x_axis和y_axis。您可以将x和y重新赋值给load_xy文件。
x = load_xy["x_axis"]
y = load_xy["y_axis"]
print(x)
print(y)[0 1 2 3 4 5 6 7 8 9]
[ 0 1 4 9 16 25 36 49 64 81]
成功¶
您已经使用savez和load创建、保存、删除和加载了变量x和y。做得很好。
另一个选项:保存为人类可读的csv¶
让我们考虑另一种情况,您想与其他人或程序共享x和y。您可能需要一个人类可读的文本文件,以便更容易共享。接下来,您将使用 savetxt 将x和y保存为逗号分隔值文件x_y-squared.csv。生成的csv由ASCII字符组成。您可以将文件加载回NumPy,也可以使用其他程序读取它。
将数据重新排列成一个二维数组¶
首先,您需要从两个一维数组创建一个二维数组。csv文件类型是电子表格样式的。csv将数字排列成行——由换行符分隔——和列——由逗号分隔。如果数据更复杂,例如多个二维数组或更高维度的数组,最好使用savez。在这里,您将使用两个NumPy函数来格式化数据
np.block:此函数将数组追加到一个二维数组中np.newaxis:此函数将一维数组强制转换为一个具有10行1列的二维列向量。
array_out = np.block([x[:, np.newaxis], y[:, np.newaxis]])
print("the output array has shape ", array_out.shape, " with values:")
print(array_out)the output array has shape (10, 2) with values:
[[ 0 0]
[ 1 1]
[ 2 4]
[ 3 9]
[ 4 16]
[ 5 25]
[ 6 36]
[ 7 49]
[ 8 64]
[ 9 81]]
使用 savetxt 将数据保存到csv文件¶
您将使用带有三个选项的savetxt来使您的文件更易于阅读
X = array_out:此选项告诉savetxt将您的二维数组array_out保存到文件x_y-squared.csvheader = 'x, y':此选项在数据之前写入一个标题,用于标记csv的列delimiter = ',':此选项告诉savetxt在文件中的每个列之间放置一个逗号
np.savetxt("x_y-squared.csv", X=array_out, header="x, y", delimiter=",")打开文件x_y-squared.csv,您将看到以下内容
!head x_y-squared.csv# x, y
0.000000000000000000e+00,0.000000000000000000e+00
1.000000000000000000e+00,1.000000000000000000e+00
2.000000000000000000e+00,4.000000000000000000e+00
3.000000000000000000e+00,9.000000000000000000e+00
4.000000000000000000e+00,1.600000000000000000e+01
5.000000000000000000e+00,2.500000000000000000e+01
6.000000000000000000e+00,3.600000000000000000e+01
7.000000000000000000e+00,4.900000000000000000e+01
8.000000000000000000e+00,6.400000000000000000e+01
我们的数组作为csv文件¶
您应该在这里注意到两个特点
NumPy使用
#来忽略loadtxt的标题。如果您使用loadtxt处理其他csv文件,您可以使用skiprows = <number_of_header_lines>来跳过标题行。整数以科学记数法写入。您可以通过
savetxt选项fmt =来指定文本格式,但它仍然会以ASCII字符写入。一般来说,您无法将ASCII数字的类型保留为float或int。
现在,再次删除x和y,并将它们赋值给x-y_squared.csv中的列。
del x, yload_xy = np.loadtxt("x_y-squared.csv", delimiter=",")load_xy.shape(10, 2)x = load_xy[:, 0]
y = load_xy[:, 1]
print(x)
print(y)[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 0. 1. 4. 9. 16. 25. 36. 49. 64. 81.]
成功,但请记住您的数据类型¶
当您将数组保存到csv文件时,您没有保留int类型。当将数组加载回工作区时,默认过程是将csv文件加载为二维浮点数组,例如load_xy.dtype == 'float64'和load_xy.shape == (10, 2)。
总结¶
总之,您可以在NumPy中创建、保存和加载数组。保存数组使共享您的工作和协作更加容易。Python还有其他保存数据到文件的方法,例如 pickle,但savez和savetxt将分别满足您未来NumPy工作和与他人共享的大部分存储需求。
下一步:您可以使用 使用genfromtext导入 导入带有缺失值的数据,或者通过 读写文件 了解更多关于通用NumPy IO的信息。