使用请求将带有json的numpy数组发布到flask应用

Jor*_*son 3 python flask python-requests

使用请求,我需要在一次发布中将带有json数据的numpy数组发送到我的flask应用程序。我该怎么做呢?

Jul*_*ani 8

接受的答案对于小型阵列来说可以完成工作,但对于大型阵列来说性能却低得令人难以置信(至少有 150% 的开销)。

我建议使用 tostring() 而不是 tolist()。

编辑 2023: .tostring() 已替换为 .tobytes() - 两者都返回原始数据的副本(比发送数组的文本表示更有效)。

所以客户端会变成:

params = {'param0': 'param0', 'param1': 'param1'}
arr = np.random.rand(10, 10)
data = {'params': params, 'arr': arr.tostring()}
response = requests.post(url, json=data)
Run Code Online (Sandbox Code Playgroud)

和API:

@app.route('/test', methods=['POST'])
def test():
    data = request.json
    params = data['params']
    arr = np.fromstring(data['arr'],dtype=float).reshape(10,10)
    print(params, arr.shape)
    return "Success"
Run Code Online (Sandbox Code Playgroud)

您应该注意,数组的形状和数据类型必须事先已知或在请求正文中告知。

  • 这对我不起作用,因为 arr.tostring() 返回字节,它不是 JSON 可序列化的,因此 requests.post 会抛出错误。解决这个问题的办法是什么? (2认同)

Jor*_*son 5

要将numpy数组转换arr为json,可以在使用保留维度的同时对其进行序列化json.dumps(arr.tolist())。然后在api端,可以使用解析np.array(json.loads(arr))

但是,使用requests json参数时,将为您处理转储和加载。arr.tolist()客户端和np.array(arr)api 所需的全部内容也是如此。下面是完整的示例代码。

客户:

params = {'param0': 'param0', 'param1': 'param1'}
arr = np.random.rand(10, 10)
data = {'params': params, 'arr': arr.tolist()}

response = requests.post(url, json=data)
Run Code Online (Sandbox Code Playgroud)

API:

@app.route('/test', methods=['POST'])
def test():
    data = request.json
    params = data['params']
    arr = np.array(data['arr'])
    print(params, arr.shape)
    return "Success"
Run Code Online (Sandbox Code Playgroud)

输出:

{'param0': 'param0', 'param1': 'param1'} (10, 10)
Run Code Online (Sandbox Code Playgroud)

注意:在中使用filesdata参数时requests.post,将json禁用该参数。