使用请求,我需要在一次发布中将带有json数据的numpy数组发送到我的flask应用程序。我该怎么做?
答案 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
中使用data
或requests.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"
需要注意的是,数组的形状和数据类型必须事先知道或在请求正文中告知。