一尘不染

如何在保留矩阵尺寸的同时序列化一个numpy数组?

json

numpy.array.tostring似乎并没有保留有关矩阵尺寸的信息,要求用户向发出呼叫numpy.array.reshape

有一种方法可以在保留此信息的同时将numpy数组序列化为JSON格式?

注意: 数组可能包含整数,浮点数或布尔值。期望转置数组是合理的。

注2: 这样做是为了使numpy数组使用streamparse通过Storm拓扑,以防此类信息最终变得有意义。


阅读 293

收藏
2020-07-27

共1个答案

一尘不染

pickle.dumpsnumpy.save对重构任意NumPy数组所需的所有信息进行编码,即使存在字节序问题,不连续的数组或奇怪的元组dtype。字节序问题可能是最重要的;您不希望array([1])突然array([16777216])因为在大型字节序的计算机上加载阵列而变得无所作为。pickle尽管save有其自身的优势(npy格式合理性给出),它可能是更方便的选择。

pickle选项:

import pickle
a = # some NumPy array
serialized = pickle.dumps(a, protocol=0) # protocol 0 is printable ASCII
deserialized_a = pickle.loads(serialized)

numpy.save使用二进制格式,它需要写入文件,但是您可以使用以下方法解决io.BytesIO

a = # any NumPy array
memfile = io.BytesIO()
numpy.save(memfile, a)
memfile.seek(0)
serialized = json.dumps(memfile.read().decode('latin-1'))
# latin-1 maps byte n to unicode code point n

并反序列化:

memfile = io.BytesIO()
memfile.write(json.loads(serialized).encode('latin-1'))
memfile.seek(0)
a = numpy.load(memfile)
2020-07-27