保存和分享你的 NumPy 数组#
你将学到什么#
你将把你的NumPy数组保存为压缩文件和人类可读的逗号分隔文件,即*.csv。你还将学习如何将这两种文件类型加载回NumPy工作区。
你要做什么#
你将学习两种保存和读取文件的方法——作为压缩文件和作为文本文件——这将满足你在NumPy中大部分的存储需求。
你将创建两个一维数组和一个二维数组
您将这些数组保存到文件中
你将从工作区中删除变量
你将从保存的文件中加载变量
你将比较压缩的二进制文件与人类可读的分隔文件
你将掌握保存、加载和共享 NumPy 数组的技能
你需要什么#
NumPy
对您的工作目录的读写访问权限
使用以下命令加载必要的函数。
import numpy as np
在本教程中,您将使用以下 Python、IPython 魔法和 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
赋值给变量x
y_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 的“魔法”命令 whos
。
del x, y
%whos
Variable Type Data/Info
------------------------------
np module <module 'numpy' from '/op<...>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 '/op<...>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.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文件#
这里有两个你应该注意的特性:
NumPy 使用
#
在loadtxt
时忽略标题。如果你在使用loadtxt
处理其他 csv 文件时,可以通过skiprows = <number_of_header_lines>
跳过标题行。整数以科学计数法书写。你可以 使用
savetxt
选项指定文本的格式,fmt =
,但它仍将以 ASCII 字符书写。一般来说,你不能将 ASCII 数字的类型保留为float
或int
。
现在,再次删除 x
和 y
,并将它们分配给 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文件加载为二维浮点数组,例如 load_xy.dtype == 'float64'
和 load_xy.shape == (10, 2)
。
总结#
总之,你可以在 NumPy 中创建、保存和加载数组。保存数组使得分享你的工作和协作变得更加容易。Python 还有其他保存数据到文件的方法,例如 pickle,但 savez
和 savetxt
将分别满足你未来 NumPy 工作和与他人分享的大部分存储需求。
下一步:你可以从 使用 genfromtext 导入 导入带有缺失值的数据,或者通过 读写文件 了解更多关于 NumPy IO 的一般知识。