将多个Numpy数组保存到Numpy二进制文件(Python)

2024-04-19 11:18:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将多个大型numpy数组保存到一个numpy二进制文件中,以防止代码崩溃,但当我添加数组时,它似乎会不断被覆盖。最后保存的数组是打开并读取save.npy时设置为AllArray的数组。这是我的密码:

with open('save.npy', 'wb') as f:
     for num in range(500):
          array = np.random.rand(100,400)
          np.save(f, array)

with open('save.npy', 'rb') as f:
     allarrays = np.load(f)

如果该文件以前存在,我希望在重新运行代码时覆盖它。这就是为什么我选择“wb”而不是“ab”


Tags: 文件代码numpy密码saveaswithnp
3条回答

我也遇到了这个问题,并以一种不太整洁的方式解决了它,但也许它对其他人有用。它的灵感来自hpaulj的方法,该方法是不完整的(即不加载数据)。也许这不是一个人应该如何解决这个问题的开始…但无论如何,请继续读下去

我使用与OP类似的程序保存数据

# Saving the data in a for-loop
with open(savefilename, 'wb') as f:
    for datafilename in list_of_datafiles:
        # Do the processing
        data_to_save = ...
        np.save( savefilename, data_to_save )

遇到了调用np.load()只加载最后保存的数组的问题,其余的都没有加载。但是,我知道数据原则上包含在*.npy文件中,因为文件大小在保存循环中不断增大。所需要的只是在反复调用load命令的同时循环numpy数组的内容。由于我不太清楚文件中包含了多少个文件,我只是在加载循环上循环,直到失败。它很粗糙,但很管用

# Loading the data in a for-loop
data_to_read = []
with open(savefilename, 'r') as f:
    while True:
        try:
            data_to_read.append( np.load(f) )
        except:
            print("all data has been read!")
            break

然后您可以调用len(data_to_read)来查看其中包含多少数组。调用data_to_read[0]会给出第一个保存的数组,等等

您可以尝试将内存映射到磁盘

# merge arrays using memory mapped file
mm = np.memmap("mmap.bin", dtype='float32', mode='w+', shape=(500,100,400))
for num in range(500):
    mm[num::] = np.random.rand(100,400)

# save final array to npy file
with open('save.npy', 'wb') as f:
    np.save(f, mm[::])
 alist =[]
 with open('save.npy', 'rb') as f: 
      alist.append(np.load(f))

当你加载时,你已经收集了列表中的所有加载load仅从当前文件位置开始加载一个数组

相关问题 更多 >