有人可以向我解释为什么这不起作用:
步骤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
分配给数组没有做任何事情。为什么呢?
答案 0 :(得分:3)
看起来好像npzfile伪字典(实际上是numpy.lib.npyio.NpzFile
)是不可写的。如果为数组设置单独的变量,则可以写入:
a = npzfile['field1']
a[0,0] = 3.2
print a
有趣的是,与正常数组np.may_share_memory(a, npzfile['field1'])
不同,返回False
,而如果设置b=a
,则np.may_share_memory(a, b)
会返回True
。从npzfile伪dict中将field1
数组提取到一个新变量中是创建一个副本,如果它是标准的numpy ndarray,这不是正常的行为。我不熟悉numpy.lib.npyio.NpzFile
类型的内部,但我猜即使type(npzfile['field1'])
是ndarray
,它的内存也会被区别对待。
答案 1 :(得分:0)
希望不要在这里说明太明显,但我从中创建dict
:
a = dict(npzfile)
现在您可以添加一个字典,然后将np.savez
添加到文件中。我会假设这会将所有内容加载到内存中,这可能是您想要的也可能不是(基于@Saullo Castro上面的评论。)