python - 如何在保留矩阵维度的同时序列化 numpy 数组?

numpy.array.tostring 似乎没有保留关于矩阵维度的信息(参见 this question ),需要用户调用 numpy.array.reshape

有没有办法在保留此信息的同时将 numpy 数组序列化为 JSON 格式?

注意:数组可能包含整数、 float 或 bool 值。期望转置数组是合理的。

注意 2: 这样做的目的是使用 streamparse 通过 Storm 拓扑传递 numpy 数组,以防此类信息最终相关。

最佳答案

pickle.dumpsnumpy.save编码重建任意 NumPy 数组所需的所有信息,即使存在字节顺序问题、非连续数组或奇怪的结构化 dtypes。字节顺序问题可能是最重要的。您不希望 array([1]) 突然变成 array([16777216]) 因为您将数组加载到大端机器上。 pickle 可能是更方便的选择,虽然 save 有它自己的好处,在 npy format rationale 中给出.

我提供了序列化为 JSON 或字节串的选项,因为最初的提问者需要 JSON 可序列化的输出,但大多数来到这里的人可能不需要。

pickle方式:

import pickle
a = # some NumPy array

# Bytestring option
serialized = pickle.dumps(a)
deserialized_a = pickle.loads(serialized)

# JSON option
# latin-1 maps byte n to unicode code point n
serialized_as_json = json.dumps(pickle.dumps(a).decode('latin-1'))
deserialized_from_json = pickle.loads(json.loads(serialized_as_json).encode('latin-1'))

numpy.save 使用二进制格式,它需要写入文件,但您可以通过 io.BytesIO 解决这个问题:

a = # any NumPy array
memfile = io.BytesIO()
numpy.save(memfile, a)

serialized = memfile.getvalue()
serialized_as_json = json.dumps(serialized.decode('latin-1'))
# latin-1 maps byte n to unicode code point n

反序列化:

memfile = io.BytesIO()

# If you're deserializing from a bytestring:
memfile.write(serialized)
# Or if you're deserializing from JSON:
# memfile.write(json.loads(serialized_as_json).encode('latin-1'))
memfile.seek(0)
a = numpy.load(memfile)

https://stackoverflow.com/questions/30698004/

相关文章:

json - 在 Play Framework JsObject 中解析 Json 数组

javascript - IE10/11 Ajax XHR 错误 - SCRIPT7002 : XM

json - JSONObject 的 Jackson 2 等价物是什么?

java - 将 InputStream 转换为 JSONObject

ios - 使用 JSONEncoder 将 nil 值编码为 null

json - 新的@angular/cli 版本中的文件 angular-cli.json 在哪里?

c# - 如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET

java - 在 JAX-RS 2.0 客户端库中处理自定义错误响应

json - Scala:将 JSON 直接解析为案例类

json - 我应该如何处理 JSON 中的 HATEOAS 链接和引用?