Numpy 为NPZ文件赋值
有人能给我解释一下为什么这样不行吗: 步骤1)创建一个简单的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'] 这为我提供了以下输出: [[
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']