“ndarray”类型的对象不是 JSON 可序列化的

Posted

技术标签:

【中文标题】“ndarray”类型的对象不是 JSON 可序列化的【英文标题】:Object of type 'ndarray' is not JSON serializable 【发布时间】:2019-01-12 02:19:10 【问题描述】:

我是 python 和机器学习的新手。我有一个线性回归模型,它能够根据我转储以用于 Web 服务的输入来预测输出。请看下面的代码:

      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

        regression_model = LinearRegression()
        regression_model.fit(X_train, y_train)
    print(regression_model.predict(np.array([[21, 0, 0, 0, 1, 0, 0, 1, 1, 1]]))) # this is returning my expected output

joblib.dump(regression_model, '../trainedModels/MyTrainedModel.pkl')

我正在尝试使用烧瓶将其作为 Web 服务公开,如下所示:

 @app.route('/predict', methods=['POST'])
def predict():


    X = [[21, 0, 0, 0, 1, 0, 0, 1, 1, 1]]
    model = joblib.load('../trainedModels/MyTrainedModel.pkl')
    prediction = model.predict(np.array(X).tolist())
    return jsonify('prediction': list(prediction))

但它抛出了以下异常

Object of type 'ndarray' is not JSON serializable

我试过NumPy array is not JSON serializable

但仍然是同样的错误。我该如何解决这个问题

【问题讨论】:

prediction 的形状和数据类型是什么? 【参考方案1】:

尝试使用tolist() 方法转换您的ndarray

prediction = model.predict(np.array(X).tolist()).tolist()
return jsonify('prediction': prediction)

json 包示例:

a = np.array([1,2,3,4,5]).tolist()
json.dumps("prediction": a)

应该输出:

'"prediction": [1, 2, 3, 4, 5]'

【讨论】:

谢谢@mxmt。你拯救了我的一天:) @user1188867 欢迎您!另外,请阅读此 discussion 中的 cmets。简而言之,list() 不会将类型转换为原生 Python 类型。因此,它不是 JSON 序列化的“安全”函数。

以上是关于“ndarray”类型的对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章

“Mycart”类型的对象在 Django 中不是 JSON 可序列化的

Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的'))

Python 错误:TypeError:'Timestamp' 类型的对象不是 JSON 可序列化的'

“AuthToken”类型的对象不是 JSON 可序列化的

Flask API TypeError:“响应”类型的对象不是 JSON 可序列化的

TypeError:mappingproxy 类型的对象不是 JSON 可序列化的