如何在追加模式

时间:2018-03-27 20:38:22

标签: python python-3.x python-2.7 numpy

我在项目中使用numpy.savenumpy.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 ??)。如果不使用其他列表,是否有一个聪明的解决方法?

3 个答案:

答案 0 :(得分:1)

在Python3中,重复的saveload对同一个打开的文件起作用:

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问题中得到证明。从saveload代码中也可以看出这一点。

请注意,这些是单独的数组,包括保存和加载。但是如果尺寸兼容,我们可以将加载连接到一个文件中。

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()

Append multiple numpy files to one big numpy file in python

loading arrays saved using numpy.save in append mode

答案 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文件,除了将数据读入内存,构建新数组以及将新数组写入文件之外。如果要保存更多数据,请考虑编写新文件,或选择其他文件格式。