保存&从字符串中检索Numpy数组

时间:2014-09-14 20:20:50

标签: python numpy

我想将多维Numpy数组转换为字符串,然后将该字符串转换回等效的Numpy数组。

我不想将Numpy数组保存到文件中(例如通过savetxtloadtxt接口)。

这可能吗?

2 个答案:

答案 0 :(得分:12)

您可以使用np.tostringnp.fromstring

In [138]: x = np.arange(12).reshape(3,4)

In [139]: x.tostring()
Out[139]: '\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00'

In [140]: np.fromstring(x.tostring(), dtype=x.dtype).reshape(x.shape)
Out[140]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

请注意tostring返回的字符串不保存dtype,也不保存原始数组的形状。你必须自己重新供应。


另一种选择是使用np.savenp.saveznp.savez_compressed来写入io.BytesIO对象(而不是文件):

import numpy as np
import io

x = np.arange(12).reshape(3,4)
output = io.BytesIO()
np.savez(output, x=x)

字符串由

给出
content = output.getvalue()

给定字符串,您可以使用np.load

将其加载回数组
data = np.load(io.BytesIO(content))
x = data['x']

此方法也存储dtype和形状。

对于大型数组,np.savez_compressed将为您提供最小的字符串。


同样,您可以使用np.savetxtnp.loadtxt

import numpy as np
import io

x = np.arange(12).reshape(3,4)
output = io.BytesIO()
np.savetxt(output, x)
content = output.getvalue()
# '0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00\n4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00 7.000000000000000000e+00\n8.000000000000000000e+00 9.000000000000000000e+00 1.000000000000000000e+01 1.100000000000000000e+01\n'

x = np.loadtxt(io.BytesIO(content))
print(x)

要点:

  • tostring为您提供基础数据作为字符串,没有dtype或 形状
  • savetostring类似,但它也会保存dtype和shape(.npy格式)
  • savez以npz格式保存数组(未压缩)
  • savez_compressed以压缩的npz格式保存数组
  • savetxt以人类可读的格式格式化数组

答案 1 :(得分:2)

如果你想保存dtype,你也可以使用python中的pickle模块。

import pickle
import numpy as np

a = np.ones(4)
string = pickle.dumps(a)
pickle.loads(string)