保存和分享你的 NumPy 数组#

你将学到什么#

你将把你的 NumPy 数组保存为压缩文件和人类可读的逗号分隔文件,即 *.csv。你还会学习将这两种文件类型重新加载到 NumPy 工作空间中。

你将做什么#

你将学习两种保存和读取文件的方法——作为压缩文件和作为文本文件——这将满足你大多数在 NumPy 中的存储需求。

  • 你将创建两个 1D 数组和一个 2D 数组

  • 你将把这些数组保存到文件中

  • 你将从你的工作空间中删除变量

  • 你将从保存的文件中加载变量

  • 你将比较压缩的二进制文件和人类可读的分隔文件

  • 你将完成保存、加载和分享 NumPy 数组的技能

你需要什么#

  • NumPy

  • 对你的工作目录的读写访问权限

使用以下命令加载必要的函数。

import numpy as np

在本教程中,你将使用以下 Python、IPython 魔法命令和 NumPy 函数


创建你的数组#

现在你已经导入了 NumPy 库,你可以创建几个数组;让我们从两个 1D 数组 xy 开始,其中 y = x**2。你将使用 np.arangex 赋值为从 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 将它们保存到一个文件中,作为压缩数组。你将使用两个选项来标记文件中的数组,

  1. x_axis = x:此选项将名称 x_axis 分配给变量 x

  2. y_axis = y:此选项将名称 y_axis 分配给变量 y

np.savez("x_y-squared.npz", x_axis=x, y_axis=y)

删除保存的数组,并使用 NumPy 的 load 将它们重新加载#

在你的当前工作目录中,你应该有一个名为 x_y-squared.npz 的新文件。该文件是两个数组 xy 的压缩二进制文件。让我们清除工作空间并将值重新加载进来。这个 x_y-squared.npz 文件包含两个 NPY 格式 文件。NPY 格式是一个 本地二进制格式。你无法在标准文本编辑器或电子表格中读取这些数字。

  1. 使用 del 从工作空间中删除 xy

  2. 使用 np.load 将数组加载到工作空间中的字典中

要查看工作空间中有哪些变量,请使用 Jupyter/IPython 的“魔法”命令 whos

del x, y
%whos
Variable   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']
%whos
Variable   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 数组重新分配给 xy#

你现在已经创建了一个包含 NpzFile 类型的字典。包含的文件是 x_axisy_axis,这些文件是在你的 savez 命令中定义的。你可以将 xy 重新分配给 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]

成功#

你已经使用 savezload 创建、保存、删除和加载了变量 xy。干得好。

另一个选择:保存到人类可读的 csv#

让我们考虑另一种情况,你想与其他人或其他程序共享 xy。你可能需要一个人类可读的文本文件,它更容易共享。接下来,你将使用 savetxtxy 保存到一个逗号分隔值文件中,即 x_y-squared.csv。生成的 csv 由 ASCII 字符组成。你可以将该文件重新加载到 NumPy 中,或者使用其他程序读取它。

将数据重新排列成一个单一的 2D 数组#

首先,你必须从你的两个 1D 数组创建一个单一的 2D 数组。csv 文件类型是一个电子表格样式的数据集。csv 按行排列数字——以换行符分隔——以及列——以逗号分隔。如果数据更复杂,例如多个 2D 数组或更高维数组,最好使用 savez。在这里,你将使用两个 NumPy 函数来格式化数据

  1. np.block:此函数将数组附加在一起,形成一个 2D 数组

  2. np.newaxis:此函数将 1D 数组强制转换为一个 10 行 1 列的 2D 列向量。

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 将你的 2D 数组 array_out 保存到文件 x_y-squared.csv

  • header = '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 文件#

这里有两个你应该注意的特征

  1. NumPy 使用 # 来忽略使用 loadtxt 时的标题。如果你使用 loadtxt 处理其他 csv 文件,你可以使用 skiprows = <number_of_header_lines> 跳过标题行。

  2. 整数以科学计数法写入。你可以使用 savetxt 选项 fmt = 指定文本的格式,但它仍然会使用 ASCII 字符写入。一般来说,你无法保留 ASCII 数字的类型,例如 floatint

现在,再次删除 xy,并将它们分配给 x-y_squared.csv 中的列。

del x, y
load_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 文件加载为一个 2D 浮点数组,例如 load_xy.dtype == 'float64'load_xy.shape == (10, 2)

总结#

总之,你可以在 NumPy 中创建、保存和加载数组。保存数组使共享你的工作和协作变得更容易。Python 可以使用其他方式将数据保存到文件中,例如 pickle,但 savezsavetxt 将满足你大多数用于未来 NumPy 工作和分别与他人共享的存储需求。

下一步:你可以使用 使用 genfromtext 导入 导入包含缺失值的数据,或者从 读取和写入文件 中了解有关 NumPy I/O 的更多信息。