如何在AWS API响应中发送numpy数组及浮点值 支持非JSON格式吗
AWS API numpy数据传输及响应格式问题解答
1. 如何在AWS API的响应中发送numpy数组或者浮点类型数值?
原生JSON格式不支持numpy自定义数据类型,直接返回会触发序列化错误,可根据场景选择以下两种方案:
- 小体积数据优先选JSON兼容方案:
numpy标量浮点值调用.item()方法转成Python原生float类型,numpy数组调用.tolist()方法转成原生列表,同时可附带数组的dtype、shape参数方便接收端重构,示例代码:import numpy as np import json # 示例numpy数组 np_arr = np.array([1.1, 2.2, 3.3], dtype=np.float32) # 构造可序列化的响应体 response = { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": json.dumps({ "data": np_arr.tolist(), "dtype": str(np_arr.dtype), "shape": list(np_arr.shape) }) } - 大体积数组优先选二进制方案:
用numpy.save()将数组序列化到字节流,返回二进制内容,传输效率更高。如果用Lambda作为后端,需要将二进制内容Base64编码,同时设置isBase64Encoded为True,示例代码:import numpy as np from io import BytesIO import base64 buf = BytesIO() np.save(buf, np_arr) buf.seek(0) response = { "statusCode": 200, "headers": {"Content-Type": "application/octet-stream"}, "body": base64.b64encode(buf.read()).decode("utf-8"), "isBase64Encoded": True }
注意:使用二进制方案需要提前在API Gateway设置中将application/octet-stream加入二进制媒体类型列表
2. 接收AWS REST API返回的响应时,如何获取其中的numpy ndarray对象?
对应发送端的两种方案分别处理:
- 对应JSON兼容方案:
解析响应JSON后,用返回的data、dtype、shape参数重构数组即可:import numpy as np import requests resp = requests.get("你的API地址").json() recv_arr = np.array(resp["data"], dtype=resp["dtype"]).reshape(resp["shape"]) - 对应二进制方案:
直接读取响应的二进制内容,用numpy.load()加载:import numpy as np import requests from io import BytesIO resp_content = requests.get("你的API地址").content recv_arr = np.load(BytesIO(resp_content))
3. AWS API响应除JSON格式外,还支持其他返回格式吗?
支持,AWS API Gateway没有限制返回格式,只需要在方法响应和集成响应中配置对应的Content-Type即可,常用的支持格式包括:
- 二进制类:
application/octet-stream、图片格式(image/png/image/jpeg)、application/pdf等 - 文本类:
text/plain、text/html、text/csv等 - 其他结构化数据类:
application/xml、application/x-protobuf等
所有非UTF-8编码的内容都需要在API Gateway的二进制媒体类型配置中添加对应Content-Type,避免自动转码导致数据损坏。
内容的提问来源于stack exchange,提问作者AmrutaHebli
相关产品推荐
相关产品推荐

