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

时间:2018-11-29 21:50:23

标签: python flask python-requests

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

2 个答案:

答案 0 :(得分:4)

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

但是,当使用请求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)

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"

输出:

{'param0': 'param0', 'param1': 'param1'} (10, 10)

注意:在files中使用datarequests.post参数时,将禁用json参数。

答案 1 :(得分:1)

接受的答案可以完成小型阵列的工作,但大型阵列的性能非常低(至少 150% 的开销)。

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

所以客户端会变成:

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

和 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"

需要注意的是,数组的形状和数据类型必须事先知道或在请求正文中告知。