有人可以向我解释为什么这不起作用:
步骤1)创建一个简单的NPZ文件
import numpy as np
a1 = np.zeros((3,2), dtype=np.double)
np.savez('npzfile.npz', field1=a1)
Run Code Online (Sandbox Code Playgroud)
步骤2)打开NPZ文件并尝试为其赋值
npzfile = np.load('npzfile.npz')
npzfile['field1'][0,0] = 3.2
print npzfile['field1']
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
[[ 0. 0.]
[ 0. 0.]
[ 0. 0.]]
Run Code Online (Sandbox Code Playgroud)
换句话说,尝试分配3.2给数组没有任何作用。为什么?
希望这里没有说得太明显,但我dict从中创建了一个:
a = dict(npzfile)
Run Code Online (Sandbox Code Playgroud)
现在您有了一个字典,可以将其添加到文件中并稍后添加np.savez到文件中。我假设这会将所有内容加载到内存中,这可能是也可能不是您想要的(基于@Saullo Castro 上面的评论。)
看起来好像 npzfile 伪字典(实际上numpy.lib.npyio.NpzFile是 a )不可写。如果为数组设置一个单独的变量,则可以写入:
a = npzfile['field1']
a[0,0] = 3.2
print a
Run Code Online (Sandbox Code Playgroud)
有趣的是,与普通数组不同,np.may_share_memory(a, npzfile['field1'])返回False,而如果设置b=a,则np.may_share_memory(a, b)返回True。field1将数组从 npzfile 伪字典中提取到新变量中就是创建一个副本,如果它是标准 numpy ndarray,则这不是正常行为。我不熟悉该numpy.lib.npyio.NpzFile类型的内部结构,但我猜测即使type(npzfile['field1'])是 an ndarray,它的内存也会被不同地对待。