直接从numpy数组创建一个zip文件而不需要中间文件

时间:2014-12-28 22:12:13

标签: python arrays numpy zipfile

我使用tofile函数从NumPy数组中编写了大量二进制数据。

由于我想节省空间,我想知道是否有可能以压缩zip格式编写该文件而无需先写入二进制文件,然后压缩它然后删除它。 / p>

代码的相关部分非常简单。其中energies2DL是2维Python列表:

energiesA = np.array(energies2DL, dtype=np.float32)
energiesA.tofile('ACE_ions_fieldrotation.bin')

2 个答案:

答案 0 :(得分:3)

这是另一种选择。使用tostring()方法将数组中的数据转换为字符串,然后使用gzip库将字符串写入压缩文件。

例如,

In [8]: foo
Out[8]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [9]: import gzip

In [10]: f = gzip.open('foo.bin.gz', 'wb')

In [11]: f.write(foo.tostring())
Out[11]: 128

In [12]: f.close()

查看终端中的文件:

$ wc -c foo.bin.gz
      62 foo.bin.gz
$ gunzip foo.bin.gz
$ wc -c foo.bin
     128 foo.bin
$ hexdump foo.bin
0000000 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
0000010 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00
0000020 04 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00
0000030 06 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00
0000040 08 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00
0000050 0a 00 00 00 00 00 00 00 0b 00 00 00 00 00 00 00
0000060 0c 00 00 00 00 00 00 00 0d 00 00 00 00 00 00 00
0000070 0e 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00
0000080

(如果我们可以写

那就太好了
f = gzip.open('foo.bin.gz', 'wb')
foo.tofile(f)
f.close()

但遗憾的是,numpy tofile()方法不接受gzip.open()返回的gzip文件对象。)

答案 1 :(得分:1)

您可以使用np.savez_compressed以压缩的NPZ格式保存数组。您必须使用np.load将文件读回数组。

示例:将foo保存到foo.npz

In [61]: foo
Out[61]: 
array([[ 0.    ,  0.0625,  0.125 ,  0.1875],
       [ 0.25  ,  0.3125,  0.375 ,  0.4375],
       [ 0.5   ,  0.5625,  0.625 ,  0.6875],
       [ 0.75  ,  0.8125,  0.875 ,  0.9375]])

In [62]: np.savez_compressed("foo.npz", foo=foo)

(您可以通过提供更多参数将多个数组保存到文件中。)

将数据读回数组:

In [63]: data = np.load("foo.npz")

In [64]: newfoo = data['foo']

In [65]: newfoo
Out[65]: 
array([[ 0.    ,  0.0625,  0.125 ,  0.1875],
       [ 0.25  ,  0.3125,  0.375 ,  0.4375],
       [ 0.5   ,  0.5625,  0.625 ,  0.6875],
       [ 0.75  ,  0.8125,  0.875 ,  0.9375]])