跳至文章前言跳至文章内容
网站加载不正确?

这可能是由于 BASE_URL 配置不正确所致。请参阅 MyST 文档 作为参考。

保存和共享您的NumPy数组

您将学到什么

您将把NumPy数组保存为压缩文件和人类可读的逗号分隔文件,即*.csv。您还将学习如何将这两种文件类型加载回NumPy工作区。

您将做什么

您将学习两种保存和读取文件的方式——压缩文件和文本文件——这将满足您在NumPy中的大部分存储需求。

您将需要什么

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

import numpy as np

在本教程中,您将使用以下Python、IPython magic和NumPy函数


创建您的数组

现在您已经导入了NumPy库,您可以创建几个数组;让我们从两个一维数组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. 使用 delxy从工作区中删除

  2. 使用 np.load 将数组加载到工作区,存储在一个字典中

要查看工作区中有哪些变量,请使用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数组重新赋值给xy

您现在已经创建了一个NpzFile类型的字典。包含的文件是您在savez命令中定义的x_axisy_axis。您可以将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,也可以使用其他程序读取它。

将数据重新排列成一个二维数组

首先,您需要从两个一维数组创建一个二维数组。csv文件类型是电子表格样式的。csv将数字排列成行——由换行符分隔——和列——由逗号分隔。如果数据更复杂,例如多个二维数组或更高维度的数组,最好使用savez。在这里,您将使用两个NumPy函数来格式化数据

  1. np.block:此函数将数组追加到一个二维数组中

  2. 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来使您的文件更易于阅读

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文件加载为二维浮点数组,例如load_xy.dtype == 'float64'load_xy.shape == (10, 2)

总结

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

下一步:您可以使用 使用genfromtext导入 导入带有缺失值的数据,或者通过 读写文件 了解更多关于通用NumPy IO的信息。