如何在循环中使用“numpy.savez”保存多个数组?

2024-04-26 00:08:09 发布

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

从循环中我得到一个数组。我想把这个数组保存在tempfile中。 问题是np.savez只保存循环中的最后一个数组。我想我明白为什么会这样,但不知道如何做得更好。

为了解决我的问题,我想在mode=a+b中打开tempfile,目的是从循环中追加新数组。但这不管用。

我的代码:

tmp = TemporaryFile(mode="a+b")    
for i in range(10):
  array = getarray[i]  #demo purpose
  np.savez(tmp,array)
tmp.seek(0)

然后使用tempfile读取数组:

tmp_read = np.load(tmp)
print tmp_read.files
[OUTPUT]: ['arr_0']

但我想在tempfile中有10个数组。有什么想法吗?
谢谢


Tags: 代码in目的forreadmodenprange
3条回答

我不是一个有经验的程序员,但这是我做的方式(只是以防万一它可能会帮助某人在未来)。此外,这是我第一次在这里发帖,如果我没有遵循某种标准,我深表歉意;)

创建npz文件:

import numpy as np

tmp = file("C:\\Windows\\Temp\\temp_npz.npz",'wb')

# some variables
a= [23,4,67,7]
b= ['w','ww','wwww']
c= np.ones((2,6))

# a lit containing the name of your variables
var_list=['a','b','c']

# save the npz file with the variables you selected
str_exec_save = "np.savez(tmp,"    
for i in range(len(var_list)):    
    str_exec_save += "%s = %s," % (var_list[i],var_list[i])
str_exec_save += ")"
exec(str_exec_save)

tmp.close

加载具有原始名称的变量:

import numpy as np
import tempfile

tmp = open("C:\\Windows\\Temp\\temp_npz.npz",'rb')

# loading of the saved variables
var_load = np.load(tmp)

# getting the name of the variables
files = var_load.files

# loading then with their original names
for i in range(len(files)):
    exec("%s = var_load['%s']" % (files[i],files[i]) )

唯一的区别是变量会变成numpy变量。

对不起,我的英语提前了。

因为savez函数打开文件,写入所有变量,然后关闭文件,所以数据在调用时会被重写。

savez很简单。你可以在https://github.com/numpy/numpy/blob/master/numpy/lib/npyio.py找到代码

如何实现“your_own_savez”,然后使用以下代码。

tmp = TemporaryFile()
f = my_savez(tmp)    
for i in range(10):
    array = getarray[i]  #demo purpose
    f.savez(array)
f.close()

tmp.seek(0)
tmp_read = np.load(tmp)
print tmp_read.files

这是我的快速和肮脏的代码。

import numpy as np
import tempfile

class my_savez(object):
    def __init__(self, file):
        # Import is postponed to here since zipfile depends on gzip, an optional
        # component of the so-called standard library.
        import zipfile
        # Import deferred for startup time improvement
        import tempfile
        import os

        if isinstance(file, basestring):
            if not file.endswith('.npz'):
                file = file + '.npz'

        compression = zipfile.ZIP_STORED

        zip = self.zipfile_factory(file, mode="w", compression=compression)

        # Stage arrays in a temporary file on disk, before writing to zip.
        fd, tmpfile = tempfile.mkstemp(suffix='-numpy.npy')
        os.close(fd)

        self.tmpfile = tmpfile
        self.zip = zip
        self.i = 0

    def zipfile_factory(self, *args, **kwargs):
        import zipfile
        import sys
        if sys.version_info >= (2, 5):
            kwargs['allowZip64'] = True
        return zipfile.ZipFile(*args, **kwargs)

    def savez(self, *args, **kwds):
        import os
        import numpy.lib.format as format

        namedict = kwds
        for val in args:
            key = 'arr_%d' % self.i
            if key in namedict.keys():
                raise ValueError("Cannot use un-named variables and keyword %s" % key)
            namedict[key] = val
            self.i += 1

        try:
            for key, val in namedict.iteritems():
                fname = key + '.npy'
                fid = open(self.tmpfile, 'wb')
                try:
                    format.write_array(fid, np.asanyarray(val))
                    fid.close()
                    fid = None
                    self.zip.write(self.tmpfile, arcname=fname)
                finally:
                    if fid:
                        fid.close()
        finally:
            os.remove(self.tmpfile)

    def close(self):
        self.zip.close()

tmp = tempfile.TemporaryFile()
f = my_savez(tmp)
for i in range(10):
  array = np.zeros(10)
  f.savez(array)
f.close()

tmp.seek(0)

tmp_read = np.load(tmp)
print tmp_read.files
for k, v in tmp_read.iteritems():
     print k, v

可以使用*args参数在一个临时文件中保存多个数组。

np.savez(tmp, *getarray[:10])

或:

np.savez(tmp, *[getarray[0], getarray[1], getarray[8]])

相关问题 更多 >