我很惊讶地发现,如果您使用numpy.savez
将同一个numpy对象保存到file中,那么所创建的文件是不确定的。
例如
import numpy
x = numpy.random.rand(1000, 1000)
numpy.savez('foo.npz', x)
numpy.savez('bar.npz', x)
然后呢
^{2}$读取this看起来与npzzip文件中的时间戳有关。在
出于测试目的,我想验证代码创建的数据文件是否相同。我通常用pickle文件的校验和来完成这个任务,例如
import cPickle as pickle
with open('foo.pkl', 'wb') as f:
pickle.dump(x, f, protocol=2)
with open('bar.pkl', 'wb') as f:
pickle.dump(x, f, protocol=2)
然后呢
md5sum foo.pkl bar.pkl
3139d9142d57bdde0970013f39b4854f foo.pkl
3139d9142d57bdde0970013f39b4854f bar.pkl
对numpy.savez
做同样的事情有什么解决办法吗?在
这可以通过numpy记录/结构来实现,唯一的限制是每个数组的第一个维度必须相同。在
下面是使其与numpy记录一起工作的代码片段,以便您甚至可以使用kwargs。在
输出:
^{pr2}$如果您确实没有将关键字参数传递给^{} (也就是说,实际上只是序列化数据,而不想以后根据键引用这些项),那么可以使用^{} 将多个数组转储到同一个文件中:
生成的新文件具有相同的哈希值,甚至与原始文件的大小完全相同:
^{pr2}$只要从文件中按顺序读取变量,就不会注意到函数上的差异。当然,您将需要一个
myload
来生成保存的数组,直到它们全部消失(或者更花哨地保存一个初始的整数头,告诉您保存到文件中的数组的数量)。诚然,这种方法是愚蠢的,但它可能会削减它取决于您的具体用例。在如果您想使用键访问保存的变量,您仍然可以考虑编写一个用于测试的辅助函数,该函数读取“production”} might not )。在
.npz
文件,迭代它们的有序键,使用上面的mysavez
函数按顺序保存它们,然后计算这些“扁平化”pickle文件的哈希值。当然,您可能不需要np.save
来实现这一点:pickle
也可以为您做同样的事情(尽管^{相关问题 更多 >
编程相关推荐