📅  最后修改于: 2020-09-06 08:44:02             🧑  作者: Mango
当直接编码/序列化与NumPy阵列成JSON格式,一般会遇到Object of type ndarray is not JSON serializable
的错误。因此,我们学习将NumPy数组与JSON格式的数据转换。
此方法我们已经有过多次的介绍,详情如下,我们在此看一看如何将numpy的ndarray格式转换为json。
import json
from json import JSONEncoder
import numpy
class NumpyArrayEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, numpy.ndarray):
return obj.tolist()
return JSONEncoder.default(self, obj)
numpyArrayOne = numpy.array([[11, 22, 33], [44, 55, 66], [77, 88, 99]])
# Serialization
numpyData = {"array": numpyArrayOne}
encodedNumpyData = json.dumps(numpyData, cls=NumpyArrayEncoder) # use dump() to write array into file
print("Printing JSON serialized NumPy array")
print(encodedNumpyData)
# Deserialization
print("Decode JSON serialized NumPy array")
decodedArrays = json.loads(encodedNumpyData)
finalNumpyArray = numpy.asarray(decodedArrays["array"])
print("NumPy Array")
print(finalNumpyArray)
打印输出:
Printing JSON serialized NumPy array
{"array": [[11, 22, 33], [44, 55, 66], [77, 88, 99]]}
Decode JSON serialized NumPy array
NumPy Array
[[11 22 33]
[44 55 66]
[77 88 99]]
我们将执行以下操作:
import numpy
from json import JSONEncoder
import json
class NumpyArrayEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, numpy.ndarray):
return obj.tolist()
return JSONEncoder.default(self, obj)
numpyArrayOne = numpy.array([[11 ,22, 33], [44, 55, 66], [77, 88, 99]])
numpyArrayTwo = numpy.array([[51, 61, 91], [121 ,118, 127]])
# Serialization
numpyData = {"arrayOne": numpyArrayOne, "arrayTwo": numpyArrayTwo}
print("serialize NumPy array into JSON and write into a file")
with open("numpyData.json", "w") as write_file:
json.dump(numpyData, write_file, cls=NumpyArrayEncoder)
print("Done writing serialized NumPy array into file")
# Deserialization
print("Started Reading JSON file")
with open("numpyData.json", "r") as read_file:
print("Converting JSON encoded data into Numpy array")
decodedArray = json.load(read_file)
finalNumpyArrayOne = numpy.asarray(decodedArray["arrayOne"])
print("NumPy Array One")
print(finalNumpyArrayOne)
finalNumpyArrayTwo = numpy.asarray(decodedArray["arrayTwo"])
print("NumPy Array Two")
print(finalNumpyArrayTwo)
打印输出如下:
serialize NumPy array into JSON and write into a file
Done writing serialized NumPy array into file
Started Reading JSON file
Converting JSON encoded data into Numpy array
NumPy Array One
[[11 22 33]
[44 55 66]
[77 88 99]]
NumPy Array Two
[[ 51 61 91]
[121 118 127]]
即需要写入Json的数据包含整形、浮点型、ndarray等多种数据类型。
import json
from json import JSONEncoder
import numpy as np
class NumpyArrayEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(NumpyArrayEncoder, self).default(obj)
# Serialization
numPyData = {"id": 25, "floatSample": np.float32(1.2), "intSample":np.int32(42), "arangeSample": np.arange(12)}
encodedNumpyData = json.dumps(numPyData, cls=NumpyArrayEncoder) # use dump() to write array into file
print("Printing JSON serialized NumPy array")
print(encodedNumpyData)
# Deserialization
print("Decode JSON serialized NumPy array")
decodedArrays = json.loads(encodedNumpyData)
numPyFloat = np.asarray(decodedArrays["floatSample"])
print("numPy Float")
print(numPyFloat)
numPyInt = np.asarray(decodedArrays["intSample"])
print("numPy Integer")
print(numPyInt)
numPyArange = np.asarray(decodedArrays["arangeSample"])
print("numPy arange")
print(numPyArange)
打印输出:
Printing JSON serialized NumPy array
{"id": 25, "floatSample": 1.2000000476837158, "intSample": 42, "arangeSample": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]}
Decode JSON serialized NumPy array
numPy Float
1.2000000476837158
numPy Integer
42
numPy arange
[ 0 1 2 3 4 5 6 7 8 9 10 11]
关于pandas及其丰富的用法,请参阅我们之前的相关介绍https://www.imangodoc.com/599.html
在此我们只介绍如何借助pandas转换数据为json格式。可以使用to_json
功能,pandas.Series.to_json
转换对象为JSON字符串。
import pandas as pd
import numpy
numpyArray = numpy.array([[51, 61, 91], [121, 118, 127]])
df = pd.DataFrame(numpyArray, index=['row 1', 'row 2'], columns=['col 1', 'col 2', 'col 3'])
df = df.to_json(orient='index')
print("Json Encoded Array")
print(df)