为什么numpy.savez()输出不可重现的文件?

lum*_*ric 7 python numpy zipfile

该函数numpy.savez()允许将numpy对象存储在文件中.将同一对象存储在两个文件中会产生两个不同的文件:

import numpy as np
some_array = np.arange(42)
np.savez('/tmp/file1', some_array=some_array)
np.savez('/tmp/file2', some_array=some_array)
Run Code Online (Sandbox Code Playgroud)

这两个文件不同:

$ diff /tmp/file1.npz /tmp/file2.npz 
Binary files /tmp/file1.npz and /tmp/file2.npz differ
Run Code Online (Sandbox Code Playgroud)

为什么文件不相同?是否包含一些随机行为,文件名或时间戳?这可以解决或修复吗?(这是一个错误?)

请注意,情况并非如此np.save().生成的文件np.save()对于相同的输入是相同的.所以我猜这与数据的压缩有关.

AFAICS只有两位不同:

$ xxd /tmp/file1.npz > /tmp/file1.hex
$ xxd /tmp/file2.npz > /tmp/file2.hex
$ diff -u0 /tmp/file1.hex /tmp/file2.hex    
--- /tmp/file1.hex      2018-03-13 13:39:12.235897095 +0100
+++ /tmp/file2.hex      2018-03-13 13:39:08.743927081 +0100
@@ -1 +1 @@
-0000000: 504b 0304 1400 0000 0000 ce6c 6d4c 9c9d  PK.........lmL..
+0000000: 504b 0304 1400 0000 0000 cf6c 6d4c 9c9d  PK.........lmL..
@@ -30 +30 @@
-00001d0: 1403 1400 0000 0000 ce6c 6d4c 9c9d 6ad9  .........lmL..j.
+00001d0: 1403 1400 0000 0000 cf6c 6d4c 9c9d 6ad9  .........lmL..j.
Run Code Online (Sandbox Code Playgroud)

在函数实现中找不到任何好的提示,但我还没有检查过压缩代码(Python 3.6也可能有所不同).

注意:使用Python 2.7和numpy 1.9.2进行测试.

sas*_*cha 9

有关于这一个github上,问题在这里:

savez()不是确定性的#9439

这似乎归结为Zip文件将时间戳附加到文件(正如您所猜测的)与临时文件的使用相结合.

解决方法太讨论,但似乎这个问题仍然是开放的(虽然Python的> = 3.6.0可能会受到影响,现在(这似乎再次被你观察到的)).