将numpy数组存储和加载为文件

use*_*596 7 python arrays string serialization numpy

在我的程序中,我正在使用不同大小的各种numpy数组.我需要将它们存储到XML文件中以供以后使用.我没有将它们写入二进制文件,因此我将所有数据放在一个地方(XML文件)而不是分散在200个文件中.

所以我尝试使用numpy的array_str()方法将数组转换为String.生成的XML如下所示:

-<Test date="2013-07-10-17:19">
    <Neurons>5</Neurons>
    <Errors>[7.7642140551985428e-06, 7.7639131137987232e-06]</Errors>
    <Iterations>5000</Iterations>
    <Weights1>[[ 0.99845902 -0.70780512 0.26981375 -0.6077122 0.09639695] [ 0.61856711 -0.74684913 0.20099992 0.99725171 -0.41826754] [ 0.79964397 0.56620812 -0.64055346 -0.50572793 -0.50100635]]</Weights1>
    <Weights2>[[-0.1851452 -0.22036027] [ 0.19293429 -0.1374252 ] [-0.27638478 -0.38660974] [ 0.30441414 -0.01531598] [-0.02478953 0.01823584]]</Weights2>
</Test>
Run Code Online (Sandbox Code Playgroud)

权重是我想要存储的值.现在问题是numpy的fromstring()方法显然不能重新加载这些......我得到"ValueError:字符串大小必须是元素大小的倍数"

我用"np.array_str(w1)"编写它们并尝试用"np.fromstring(w_str1)"读取它们.显然结果只是一维数组,即使它工作,所以我必须手动恢复形状.呃,这已经是一种痛苦,因为我也必须以某种方式存储它.

这样做的最佳方法是什么?最好还可以保存我的阵列的形状和数据类型,而不需要手动管理每个小东西.

Sau*_*tro 13

Numpy提供了一种在压缩文件中存储许多数组的简便方法:

a = np.arange(10)
b = np.arange(10)
np.savez_compressed('file.npz', a=a, b=b)
Run Code Online (Sandbox Code Playgroud)

您甚至可以在保存时更改阵列名称,例如:np.savez_compressed('file.npz', newa=a, newb=b).

要读取已保存的文件use np.load(),它将返回一个NpzFile像字典一样工作的实例:

loaded = np.load('file.npz')
Run Code Online (Sandbox Code Playgroud)

要加载数组:

a_loaded = loaded['a']
b_loaded = loaded['b']
Run Code Online (Sandbox Code Playgroud)

要么:

from operator import itemgetter
g = itemgetter( 'a', 'b' )
a_loaded, b_loaded = g(np.load('file.npz'))
Run Code Online (Sandbox Code Playgroud)

  • 至少在这里你可以在一个文件中存储许多数组,稍后可以使用字典键作为日期来访问,例如:`np.savez_compressed('all.npz',d2013_12_29 = a,d2013_12_30 = b, d2013_12_31 = c)`,你可以在这里包含任意数量的日期...... (2认同)