Flask返回文本嵌入列表遇float32序列化错误如何解决?
解决Flask返回float32类型嵌入列表的JSON序列化错误
错误原因:Python默认JSON序列化器不支持numpy的float32类型,需要将其转换为Python原生float类型后再序列化。
以下是三种可行的解决方法:
方法一:手动遍历转换类型
通过列表推导式逐个将float32元素转为原生float:
import numpy as np from flask import Flask, jsonify app = Flask(__name__) @app.route('/embeddings') def get_embeddings(): # 模拟生成的float32类型嵌入数组 embeddings_np = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9]], dtype=np.float32) # 转换为Python原生float列表 embeddings = [[float(val) for val in row] for row in embeddings_np] return jsonify({"embeddings": embeddings}) if __name__ == '__main__': app.run()
方法二:使用numpy的tolist()方法
numpy数组的tolist()方法会自动将内部的numpy数值类型转为Python原生类型,代码更简洁:
import numpy as np from flask import Flask, jsonify app = Flask(__name__) @app.route('/embeddings') def get_embeddings(): embeddings_np = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9]], dtype=np.float32) # 直接转换为原生类型列表 embeddings = embeddings_np.tolist() return jsonify({"embeddings": embeddings}) if __name__ == '__main__': app.run()
方法三:自定义JSON编码器(适合频繁处理numpy类型的场景)
自定义Flask的JSON编码器,让它支持numpy类型的自动序列化,无需每次手动转换:
import numpy as np from flask import Flask, jsonify from json import JSONEncoder class NumpyJSONEncoder(JSONEncoder): def default(self, obj): # 处理numpy浮点类型 if isinstance(obj, (np.float32, np.float64)): return float(obj) # 处理numpy数组 if isinstance(obj, np.ndarray): return obj.tolist() # 其他类型交给父类处理 return super().default(obj) app = Flask(__name__) # 替换默认编码器 app.json_encoder = NumpyJSONEncoder @app.route('/embeddings') def get_embeddings(): embeddings_np = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9]], dtype=np.float32) return jsonify({"embeddings": embeddings_np}) if __name__ == '__main__': app.run()
内容的提问来源于stack exchange,提问作者Yadnesh Salvi
相关产品推荐
相关产品推荐

