Numpy 为NPZ文件赋值

Numpy 为NPZ文件赋值,numpy,Numpy,有人能给我解释一下为什么这样不行吗: 步骤1)创建一个简单的NPZ文件 import numpy as np a1 = np.zeros((3,2), dtype=np.double) np.savez('npzfile.npz', field1=a1) 步骤2)打开NPZ文件并尝试为其赋值 npzfile = np.load('npzfile.npz') npzfile['field1'][0,0] = 3.2 print npzfile['field1'] 这为我提供了以下输出: [[

有人能给我解释一下为什么这样不行吗:

步骤1)创建一个简单的NPZ文件

import numpy as np
a1 = np.zeros((3,2), dtype=np.double)
np.savez('npzfile.npz', field1=a1)
步骤2)打开NPZ文件并尝试为其赋值

npzfile = np.load('npzfile.npz')
npzfile['field1'][0,0] = 3.2
print npzfile['field1']
这为我提供了以下输出:

[[ 0.  0.]
 [ 0.  0.]
 [ 0.  0.]]

换句话说,尝试将
3.2
分配给数组没有任何效果。为什么?

似乎npzfile伪dict(实际上是一个
numpy.lib.npyio.npzfile
)不可写。如果为数组设置了单独的变量,则可以对其进行写入:

a = npzfile['field1']
a[0,0] = 3.2
print a

有趣的是,与普通数组不同,
np.may\u共享内存(a,npzfile['field1')
返回
False
,而如果设置
b=a
np.may\u共享内存(a,b)
返回
True
。将
field1
数组从npzfile伪dict提取到一个新变量中会创建一个副本,如果它是一个标准的numpy ndarray,则这不是正常行为。我不熟悉
numpy.lib.npyio.NpzFile
类型的内部结构,但我猜即使
type(NpzFile['field1'])
是一个
ndarray
,它的内存也会得到不同的处理

希望不要在这里说明太明显的问题,但我从中创建了一个
dict

a = dict(npzfile)

现在您有了一个字典,可以添加到文件中,以后再添加到文件中。我想这会把你想要的或不想要的东西都载入记忆中(根据上面@Saullo Castro的评论)。

谢谢Josh。从源代码[link]()可以看出,NpzFile使用延迟加载,并且没有
setitem
。我猜这就是原因吗?@JoshAdel问题是,
np.load('file.npz')
在您执行
a=npzfile['key']
之前不会将文件加载到内存中,因此它会在您每次调用
时创建一个副本(它从磁盘读取并转储到内存中),即使您可以分配到
a
,新值似乎没有反映在
npzfile['field1']