在Python中开发机器学习模型通常需要使用NumPy数组。
NumPy数组是处理Python中数据的有效数据结构,scikit-learn库中的机器学习模型和Keras库中的深度学习模型都期望输入数据为NumPy数组格式,并以NumPy数组格式进行预测。
因此,将NumPy数组保存到文件是很常见的需求。
例如,您可能使用诸如缩放之类的转换来准备数据,并需要将其保存到文件以供以后使用。您也可以使用模型进行预测,并需要将预测结果保存到文件以供以后使用。
在本教程中,您将了解如何将NumPy数组保存到文件。
完成本教程后,您将了解:
- 如何将NumPy数组保存为CSV格式的文件。
- 如何将NumPy数组保存为NPY格式的文件。
- 如何将NumPy数组保存为压缩的NPZ格式的文件。
开始您的项目,阅读我的新书Machine Learning Mastery With Python,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

如何将 NumPy 数组保存到文件用于机器学习
照片作者:Chris Combe,部分权利保留。
教程概述
本教程分为三个部分;它们是:
- 将NumPy数组保存到.CSV文件(ASCII)
- 将NumPy数组保存到.NPY文件(二进制)
- 将NumPy数组保存到.NPZ文件(压缩)
1.将NumPy数组保存到.CSV文件(ASCII)
存储数值数据到文件的最常见文件格式是逗号分隔值格式,简称CSV。
您的训练数据和模型输入数据很可能存储在CSV文件中。
将数据保存到CSV文件可能很方便,例如模型的预测结果。
您可以使用savetxt() 函数将NumPy数组保存到CSV文件。此函数接受文件名和数组作为参数,并将数组保存为CSV格式。
您还必须指定分隔符;这是文件中分隔每个变量的字符,最常见的是逗号。可以通过“delimiter”参数设置。
1.1将NumPy数组保存到CSV文件的示例
下面的示例演示了如何将单个NumPy数组保存为CSV格式。
1 2 3 4 5 6 7 |
# 将numpy数组保存为csv文件 from numpy import asarray from numpy import savetxt # 定义数据 data = asarray([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) # 保存到csv文件 savetxt('data.csv', data, delimiter=',') |
运行该示例将定义一个NumPy数组并将其保存到名为‘data.csv‘的文件中。
该数组包含一行数据,共10列。我们期望这些数据被保存为CSV文件中的一行数据。
运行示例后,我们可以检查‘data.csv‘的内容。
我们应该看到以下内容:
1 |
0.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,4.000000000000000000e+00,5.000000000000000000e+00,6.000000000000000000e+00,7.000000000000000000e+00,8.000000000000000000e+00,9.000000000000000000e+00 |
我们可以看到数据已正确保存为一行,并且数组中的浮点数已以完整精度保存。
1.2从CSV文件加载NumPy数组的示例
我们可以稍后使用loadtext() 函数并指定文件名和相同的逗号分隔符,将此数据作为NumPy数组加载。
完整的示例如下所示。
1 2 3 4 5 6 |
# 从csv文件加载numpy数组 from numpy import loadtxt # 加载数组 data = loadtxt('data.csv', delimiter=',') # 打印数组 print(data) |
运行该示例将从CSV文件加载数据并打印内容,这与我们在上一个示例中定义的具有10列的单行数据相匹配。
1 |
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] |
2.将NumPy数组保存到.NPY文件(二进制)
有时我们有很多NumPy数组数据需要高效地保存,但只需要在另一个Python程序中使用。
因此,我们可以将NumPy数组保存为原生二进制格式,这种格式在保存和加载时都非常高效。
这对于输入数据(如已准备好的转换数据)很常见,这些数据将需要用作将来测试一系列机器学习模型或运行许多实验的基础。
npy文件格式适用于这种情况,通常称为“NumPy格式”。
这可以通过使用save() NumPy函数并指定文件名和要保存的数组来实现。
2.1将NumPy数组保存到NPY文件的示例
下面的示例定义了我们的二维NumPy数组并将其保存到.npy文件中。
1 2 3 4 5 6 7 |
# 将numpy数组保存为npy文件 from numpy import asarray from numpy import save # 定义数据 data = asarray([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) # 保存到npy文件 save('data.npy', data) |
运行示例后,您将在目录中看到一个名为‘data.npy‘的新文件。
您无法直接使用文本编辑器查看此文件的内容,因为它采用的是二进制格式。
2.2从NPY文件加载NumPy数组的示例
您稍后可以使用load() 函数将此文件加载为NumPy数组。
完整的示例如下所示。
1 2 3 4 5 6 |
# 从npy文件加载numpy数组 from numpy import load # 加载数组 data = load('data.npy') # 打印数组 print(data) |
运行该示例将加载文件并打印内容,确认它已正确加载,并且内容与我们在相同二维格式中预期的一致。
1 |
[[0 1 2 3 4 5 6 7 8 9]] |
3.将NumPy数组保存到.NPZ文件(压缩)
有时,我们为建模准备的数据需要跨多个实验重复使用,但数据量很大。
这可能是预处理过的NumPy数组,例如文本语料库(整数)或一组重新缩放的图像数据(像素)。在这些情况下,希望将数据保存到文件,并且最好采用压缩格式。
这样可以将数百GB的数据减小到数百MB,并方便传输到其他服务器或云进行长时间的算法运行。
npz文件格式适用于这种情况,并且支持原生NumPy文件格式的压缩版本。
使用savez_compressed() NumPy函数可以将多个NumPy数组保存到单个压缩的.npz文件中。
3.1将NumPy数组保存到NPZ文件的示例
我们可以使用此函数将单个NumPy数组保存到压缩文件中。
完整的示例如下所示。
1 2 3 4 5 6 7 |
# 将numpy数组保存为npz文件 from numpy import asarray from numpy import savez_compressed # 定义数据 data = asarray([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) # 保存到npy文件 savez_compressed('data.npz', data) |
运行示例将定义数组并将其保存到压缩的numpy格式的文件中,文件名为‘data.npz’。
与.npy格式一样,由于文件格式是二进制的,我们无法使用文本编辑器查看已保存文件的内容。
3.2从NPZ文件加载NumPy数组的示例
稍后我们可以使用上一节中的相同load() 函数加载此文件。
在这种情况下,savez_compressed() 函数支持将多个数组保存到单个文件中。因此,load() 函数可能会加载多个数组。
加载的数组以字典的形式从load()函数返回,第一个数组的名称为‘arr_0’,第二个为‘arr_1’,依此类推。
加载我们单个数组的完整示例列在下面。
1 2 3 4 5 6 7 8 |
# 从npz文件加载numpy数组 from numpy import load # 加载数组字典 dict_data = load('data.npz') # 提取第一个数组 data = dict_data['arr_0'] # 打印数组 print(data) |
运行示例将加载包含数组字典的压缩numpy文件,然后提取我们保存的第一个数组(我们只保存了一个),然后打印内容,确认值和数组的形状与我们最初保存的一致。
1 |
[[0 1 2 3 4 5 6 7 8 9]] |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
文章
API
- numpy.savetxt API
- numpy.save API
- numpy.savez API
- numpy.savez_compressed API
- numpy.load API
- numpy.loadtxt API
总结
在本教程中,您了解了如何将NumPy数组保存到文件。
具体来说,你学到了:
- 如何将NumPy数组保存为CSV格式的文件。
- 如何将NumPy数组保存为NPY格式的文件。
- 如何将NumPy数组保存为压缩的NPZ格式的文件。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
非常有趣。它们之间在性能上有什么区别吗?特别是CSV和NPY之间?除非有区别,否则使用便携式CSV可能会更方便。
我认为对于快速文件系统,NPY应该比NPZ快,但在非常大的数组和慢速文件系统上,NPZ有时可能更快。
谢谢!
好问题。我没有关于性能比较的好数据,尽管处理10/100MB的随机浮点数数组可以很快得到结果。
我的期望是,将数据快速加载到RAM,例如压缩数据,性能最好。
我自己大量使用NPY和NPZ。
嗨,Jason,
感谢这篇帖子,这是一个非常有用的功能,是对本网站上关于模型处理的另一篇好帖的补充:https://machinelearning.org.cn/save-load-machine-learning-models-python-scikit-learn/
谢谢!
嗨,Jason,
看起来savetxt只适用于一维或二维数组。
但npy和npz没有问题。
谢谢你。
是的。
请问您能给我关于这个主题的书籍吗?
关于保存NumPy数组的书?
您具体遇到了什么其他问题?
嗨!
请问能否告诉我是否可以将元素追加到.npy文件中?
例如,假设我有一个numpy数组
x
,并将其存储在x.npy
中。如果我现在想向其中追加几个元素,是否必须先加载它,追加,然后再次保存?还是有办法直接追加到x.npy
文件而不加载它?感谢这篇以及其他所有精彩的文章。
也许可以。
我建议您加载到内存中,然后追加到数组,然后再次保存。
一如既往,精彩的文章,Jason博士!
但是,如果数据量太大无法放入RAM,那么将.npy文件加载到内存中,然后追加到数组,再重新保存,我认为是不可能的。
那么如何将非常大的数据保存到.npy文件呢??
也许可以探索使用内存映射文件?
https://docs.pythonlang.cn/3.6/library/mmap.html
如何在一个任意的npz文件中识别出‘arr_0’是什么?
data = dict_data[‘arr_0’]
数组是按保存的顺序加载的。
在Google Colab中创建.npz文件并将其保存到Google Drive后,如何向已保存的.npz文件追加内容?
您可以加载数组,连接数组,然后重新保存它。
我尝试用这个来转储大量的数组,但没有成功。进程在漫长的等待后被终止。
也许可以尝试一个子集来确认您的代码是否正常工作。
谢谢你,Jason。
我已将图像作为数组保存到csv文件中,但当我尝试从保存的数组显示图像时,它没有显示图片。
这是因为我可以使用从同一张图片创建的数组(不保存为csv)来显示图像,但当它从csv文件读取时却不起作用。
我认为这是因为数组中每个数字后面的点。
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
您知道如何从csv读取时去除这些点吗?
是的,您可能需要更改数组的形状,并在使用matplotlib显示之前缩放像素值。
我在博客上有一些这方面的例子。
这是针对一维数组的。如何将二维数组转换为.csv格式?
代码相同。
如何将3D数组保存到.csv文件中?
与二维数组相同。例如,调用相同的函数来保存和加载它。
当我为我的数组运行这个时,我得到了这个错误消息:“Expected 1D or 2D array, got 4D array instead。”这是否意味着我有一个4D数组,现在我的问题是,我该如何最好地保存它?这是我迄今为止用于保存它的代码:
# 将numpy数组保存为csv文件
from numpy import asarray
from numpy import savetxt
# 定义数据
nieuwe_array =asarray([[nieuwe_array]])
# 保存到csv文件
savetxt(‘nieuwe_array.csv’, nieuwe_array, delimiter=’,’)
这很令人惊讶。
据我所知,保存数组与数组的大小和维度无关。
Jason,
您的教程太棒了!我享受并受益于其中的许多教程。如果有什么可以推荐您的作品的地方,请告诉我。
谢谢。
Souvik
谢谢!
是的,您在社交媒体上宣传我的作品的任何行为都有帮助。
是否可以将图像数据集加载然后将图像数据集转换为csv文件?
不,我们不将图像转换为CSV文件。
我想知道np.save、np.savez_compressed或某些其他方法(joblib、json)是否最适合我的情况。该数组在内存中大约有150 GB。
首先我尝试了json,但它超出了我的内存限制
with open(‘X_train_list.json’, ‘w’) as file_handle
json.dump(X_train.tolist(), file_handle)
我有X_train(一个np数组),我先将其转换为X_train.tolist(),然后使用json.dump()。我认为将其转换为列表和/或使用json.dump()会在写入之前在内存中保存副本。
我的首要任务是不要超出内存。然后其他需要考虑的因素是:写入/读取速度、文件大小、文件类型的通用性(例如,如果我使用新版本的dill,它是否会轻易损坏,其他程序是否可以打开它)。
您有什么建议吗?非常感谢这篇教程。
这数据量太大了!
我的建议是试用几种方法,找出哪种最符合您的要求。也许可以对管理大数据进行一些专门的研究,例如内存映射文件。
你好!
我想将我所有的图像(真实和伪造)路径与其标签(真实为1,伪造为0)一起保存,在真实和伪造比较后,第三列将再次显示标签,显示真实或伪造(0或1),保存在txt或csv文件中。
我正在尝试这样做,但无法实现,您能帮帮我吗?
我想要以下格式:
Path1 Path2 labels
E/img.jpg 1 E/img.jpg 1 1
E/img.jpg 1 E/img.jpg 0 0
也许可以先在内存中将您的数据构建为一个数组,然后将该数组作为CSV保存到文件中。
我运行了一段代码,将我的图像(2868张)存储为一个用于图像分类任务的数组。数组的形状是(2868, 224, 224, 3)。我使用numpy.save()保存了数组。但后来当我尝试加载数组时,它给出了以下错误:“无法将大小为92437951的数组重塑为形状(2868,224,224,3)”。如何解决这个问题?numpy.load()不能用于多维数组吗?
这太奇怪了。
也许可以尝试将你的代码和错误消息发布到stackoverflow.com。
如何从CSV文件读取NumPy矩阵并进行操作和访问。
假设我想找到每一行的最大值。
本教程将向您展示如何将CSV加载为numpy数组。
https://machinelearning.org.cn/load-machine-learning-data-python/
嗨,Jason,你能告诉我如何将一系列视频的帧像素值存储到NumPy .npz文件中以训练模型吗?我正在使用LSTM来预测所有视频中的某些类,但在使用LSTM层时,它总是显示形状错误。你能帮帮我吗?
抱歉,我没有加载和处理视频的示例,无法为您提供有用的建议。
关于视频与模型,我推荐使用CNN-LSTM,您可以在LSTM书中找到一个示例。
https://machinelearning.org.cn/lstms-with-python/