首页 > 解决方案 > Pickle dump-load 似乎修改了 numpy 数据

问题描述

我希望 pickle 写入读取会返回输入数据的副本。这段代码似乎与我的预期相矛盾:

import pickle
import filecmp
import numpy as np


def pload(filename):
    with open(filename, "rb") as f:
        return pickle.load(f)


def pdump(data, filename):
    with open(filename, "wb") as f:
        pickle.dump(data, f)


v1 = np.ndarray([1, 2])

v2 = np.float64(1.2)

for v in [(v1,), (v2,), (v1, v2)]:
    pdump(v, "/tmp/test-a")
    tmp = pload("/tmp/test-a")
    numpy_eq = all([np.array_equal(a, b) for a, b in zip(v, tmp)])
    pdump(tmp, "/tmp/test-b")
    pickle_eq = filecmp.cmp("/tmp/test-a", "/tmp/test-b")
    print(f"Equality: numpy={numpy_eq}, pickle={pickle_eq}")

该脚本输出:

Equality: numpy=True, pickle=True
Equality: numpy=True, pickle=True
Equality: numpy=True, pickle=False

我希望看到一切真实;最后一行显示pickle=False。有谁知道为什么?

标签: pythonnumpypickle

解决方案


推荐阅读