【问题标题】:How to use `numpy.savez` in a loop to save multiples numpy arrays?如何在循环中使用`numpy.savez`来保存多个numpy数组?
【发布时间】:2017-08-02 15:16:00
【问题描述】:

我想在循环中使用numpy.savez 来多次保存多个numpy 数组,这里是一个例子:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([5, 6, 12])

for i in range(3):
    np.savez("file_info", info1 = a, info2 = b)
    print('a => ', a)
    print('b => ', b)
    a = a * 3
    b = b * 2

输出:

a =>  [1 2 3]
b =>  [ 5  6 12]
a =>  [3 6 9]
b =>  [10 12 24]
a =>  [ 9 18 27]
b =>  [20 24 48]

但是当我读取保存的文件时:

npzfile = np.load("file_info.npz")
npzfile['info1']

我只得到最后一个数组(因为在每个循环中都会删除内容):

array([ 9, 18, 27])

所以,我的问题是,如何将所有 numpy 数组保存在同一个文件中?

【问题讨论】:

  • 通过使用不同的输出文件。或者,如果您想要一个文件中的所有内容,请制作一个大数组,再加一个外暗。

标签: python arrays numpy save


【解决方案1】:

当您保存同名的新文件时,它会覆盖旧文件。你为什么不把你的保存从你的 for 循环中取出来:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([5, 6, 12])

save_info = np.zeros([3, 2, 3]) #array to store all the info
#one dimension for each entry in a, one for as many arrays as you have
#generating info, and one for the number of times you'll loop over it

for i in range(3): #therefore i will be [0, 1, 2]
    save_info[:, 0, i] = a #save from the a array
    save_info[:, 1, i] = b #save from the b array
    a = a * 3
    b = b * 2

np.savez("file_info", info1=save_info) #save outside for loop doesn't overwrite

然后我可以从文件中读取信息:

>>> import numpy as np
>>> data = np.load("file_info.npz") #load file to data object
>>> data["info1"]
array([[[  1.,   3.,   9.],
        [  5.,  10.,  20.]],

       [[  2.,   6.,  18.],
        [  6.,  12.,  24.]],

       [[  3.,   9.,  27.],
        [ 12.,  24.,  48.]]])

编辑: 或者,如果您要避免创建一个大数组,则可以在每次循环时重命名要保存的文件:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([5, 6, 12])

for i in range(3): #therefore i will be [0, 1, 2]
    np.savez("file_info_"+str(i), info1=a, info2=b)
    #will save to "file_info_0.npz" on first run
    #will save to "file_info_1.npz" on second run
    #will save to "file_info_2.npz" on third run

    a = a * 3
    b = b * 2

编辑: 您可能更喜欢创建两个较小的数组,一个用于 a,一个用于 b:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([5, 6, 12])

save_a = np.zeros([3, 3]) #array to store all the a runs
save_b = np.zeros([3, 3]) #array to store all the b runs

for i in range(3): #therefore i will be [0, 1, 2]
    save_a[:, i] = a #save from the a array
    save_b[:, i] = b #save from the b array
    a = a * 3
    b = b * 2

np.savez("file_info", info1=save_a, info2=save_b) #save outside for loop doesn't overwrite

【讨论】:

  • 我正在避免创建一个数组来存储所有信息,因为我正在处理大量数据。
  • 你可以把它保存到不同的文件吗?例如np.savez("file_info"+str(i), info1=a, info2=b)?
  • 好吧,如果我这样做,我会得到.. 我不知道可能有 5000 个文件,我会看看有没有办法解决。谢谢。
  • Numpy 擅长大数组(我一直用它来处理 5000x3000 彩色图像)所以我不会太担心,除非您的数据真的真的巨大?祝项目顺利。
猜你喜欢
  • 2012-04-21
  • 2019-12-15
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多