numpy.array.tostring
似乎没有保留关于矩阵维度的信息(参见 this question ),需要用户调用 numpy.array.reshape
。
有没有办法在保留此信息的同时将 numpy 数组序列化为 JSON 格式?
注意:数组可能包含整数、 float 或 bool 值。期望转置数组是合理的。
注意 2: 这样做的目的是使用 streamparse 通过 Storm 拓扑传递 numpy 数组,以防此类信息最终相关。
最佳答案
pickle.dumps
或 numpy.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