保存并共享您的 NumPy 数组#
你将学到什么#
您将 NumPy 数组保存为压缩文件和人类可读的逗号分隔文件,即 *.csv。您还将学习将这两种文件类型加载回 NumPy 工作区。
你会做什么#
您将学习两种保存和读取文件的方法(压缩文件和文本文件),这将满足您在 NumPy 中的大部分存储需求。
您将创建两个一维数组和一个二维数组
您将这些数组保存到文件中
您将从工作区中删除变量
您将从保存的文件中加载变量
您将比较压缩的二进制文件与人类可读的分隔文件
您将掌握保存、加载和共享 NumPy 数组的技能
你需要什么#
Numpy
对工作目录的读写访问权限
使用以下命令加载必要的功能。
import numpy as np
在本教程中,您将使用以下 Python、IPython magic 和 NumPy 函数:
创建你的数组#
现在您已经导入了 NumPy 库,您可以创建几个数组;让我们从两个一维数组开始,x
和y
,其中。您将使用 分配从 0 到 9 的整数
。y = x**2
x
np.arange
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]
您要做的第一件事就是使用 .zip 将它们作为压缩数组保存到文件中
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“magic”命令
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 数组重新分配给x
和y
#
您现在已经创建了带有 -type 的字典NpzFile
。包含的文件是x_axis
您y_axis
在
savez
命令中定义的文件。您可以将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]
成功#
您已创建、保存、删除和加载变量x
并y
使用savez
和load
。干得好。
另一种选择:保存到人类可读的 csv #
让我们考虑另一个场景,您想要x
与y
其他人或其他程序共享。您可能需要更易于共享的人类可读文本文件。接下来,您使用 来
savetxt
将x
和保存y
在逗号分隔值文件x_y-squared.csv
.生成的 csv 由 ASCII 字符组成。您可以将该文件加载回 NumPy 或使用其他程序读取它。
将数据重新排列成单个二维数组#
首先,您必须从两个一维数组创建一个二维数组。 csv 文件类型是电子表格样式的数据集。 csv 将数字按行(用换行符分隔)和列(用逗号分隔)排列。如果数据更复杂,例如多个二维数组或更高维数组,最好使用savez
。在这里,您使用两个 NumPy 函数来格式化数据:
np.block
:该函数将数组附加到一个二维数组中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]]
使用#将数据保存到 csv 文件savetxt
您可以使用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 文件,则可以使用 .csv 跳过标题行。skiprows = <number_of_header_lines>
整数以科学记数法表示。您可以
savetxt
使用选项指定文本的格式,但仍会使用 ASCII 字符写入。一般来说,您不能将 ASCII 数字的类型保留为或。fmt =
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 文件加载为 2D 浮点数组,例如和。load_xy.dtype == 'float64'
load_xy.shape == (10, 2)
包起来#
总之,您可以在 NumPy 中创建、保存和加载数组。保存数组使您的工作共享和协作变得更加容易。 Python 还可以通过其他方式将数据保存到文件中,例如pickle,但是savez
和savetxt
将分别满足您未来 NumPy 工作和与其他人共享的大部分存储需求。
后续步骤:您可以通过使用 genfromtext 导入来导入缺失值的数据,或者通过读取和写入文件了解有关常规 NumPy IO 的更多信息。