我在项目中使用numpy.save
和numpy.load
到R / W 大型数据集。我意识到numpy.save
不适用追加模式。例如(Python 3):
import numpy as np
n = 5
dim = 5
for _ in range(3):
Matrix = np.random.choice(np.arange(10, 40, dim), size=(n, dim))
np.save('myfile', Matrix)
M1 = np.load('myfile.npy', mmap_mode='r')[1:7].copy()
print(M1)
使用切片[1:7]
加载特定部分数据不正确,因为np.save
未附加。我找到了这个answer,但它看起来很奇怪(file(filename, 'a')
什么是文件file
??)。如果不使用其他列表,是否有一个聪明的解决方法?
答案 0 :(得分:1)
在Python3中,重复的save
和load
对同一个打开的文件起作用:
In [113]: f = open('test.npy', 'wb')
In [114]: np.save(f, np.arange(10))
In [115]: np.save(f, np.zeros(10))
In [116]: np.save(f, np.ones(10))
In [117]: f.close()
In [118]: f = open('test.npy', 'rb')
In [119]: for _ in range(3):
...: print(np.load(f))
...:
[0 1 2 3 4 5 6 7 8 9]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
In [120]: np.load(f)
OSError: Failed to interpret file <_io.BufferedReader name='test.npy'> as a pickle
每个save
将自包含的数据块写入文件。它由标题块和数据缓冲区的图像组成。标题块包含有关数据缓冲区长度的信息。
每个加载读取已定义的标头块和已知的数据字节数。
据我所知,这没有记录,但已在以前的SO问题中得到证明。从save
和load
代码中也可以看出这一点。
请注意,这些是单独的数组,包括保存和加载。但是如果尺寸兼容,我们可以将加载连接到一个文件中。
In [122]: f = open('test.npy', 'rb')
In [123]: np.stack([np.load(f) for _ in range(3)])
Out[123]:
array([[0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
In [124]: f.close()
答案 1 :(得分:0)
在Python 3中不推荐使用file
函数。虽然我不保证它有效但是Python 3代码等同于你问题中链接中的代码
with open('myfile.npy', 'ab') as f_handle:
np.save(f_handle, Matrix)
然后应将Matrix
追加到'myfile.npy'
。
答案 2 :(得分:0)
npy
文件格式不起作用。 npy
文件对单个数组进行编码,其中包含指定shape,dtype和其他元数据的标头。您可以在NumPy文档中看到npy
file format spec。
支持附加数据不是npy
格式的设计目标。即使您设法将numpy.save
附加到现有文件而不是覆盖内容,结果也不会是有效的npy
文件。生成带有附加数据的有效npy
文件需要重写标题,因为这可能需要调整标题大小,它可能会移位数据并要求重写整个文件。
NumPy没有工具可以将数据附加到现有的npy
文件,除了将数据读入内存,构建新数组以及将新数组写入文件之外。如果要保存更多数据,请考虑编写新文件,或选择其他文件格式。