如何将字符串格式的坐标点转换为float数组?
解决坐标字符串转27×2浮点数组的问题
你的核心问题是直接用数值转换函数无法解析复合结构的坐标字符串,以下是三种可靠的解决方案:
方法一:用ast.literal_eval解析为列表再转数组
利用Python内置模块安全解析字符串形式的列表结构,再转为numpy浮点数组:
import ast import numpy as np points = '[1078.17,436.18],[1089.48,413.57],[1092.71,389.35],[1091.09,365.12],[1089.48,337.67],[1073.32,316.67],[1057.17,295.68],[1036.18,282.75],[1011.95,279.52],[987.73,273.06],[961.89,273.06],[937.66,276.29],[913.43,281.14],[894.05,297.29],[880.60,316.70],[874.20,343.10],[871.44,371.58],[868.21,395.81],[868.21,421.65],[887.59,437.80],[911.82,444.26],[936.04,449.11],[960.27,452.34],[984.50,453.95],[1010.34,457.18],[1034.56,455.57],[1058.79,447.49]' # 给原字符串补外层括号,转为合法的Python列表格式 points_list = ast.literal_eval(f'[{points}]') # 转为float64类型的numpy数组(替代已弃用的np.float) points_array = np.array(points_list, dtype=np.float64) print(points_array.shape) # 输出 (27, 2) print(points_array.dtype) # 输出 float64
方法二:用numpyfromstring配合字符串清理
通过清理字符串中的括号,直接读取数值并重塑形状:
import numpy as np points = '[1078.17,436.18],[1089.48,413.57],[1092.71,389.35],[1091.09,365.12],[1089.48,337.67],[1073.32,316.67],[1057.17,295.68],[1036.18,282.75],[1011.95,279.52],[987.73,273.06],[961.89,273.06],[937.66,276.29],[913.43,281.14],[894.05,297.29],[880.60,316.70],[874.20,343.10],[871.44,371.58],[868.21,395.81],[868.21,421.65],[887.59,437.80],[911.82,444.26],[936.04,449.11],[960.27,452.34],[984.50,453.95],[1010.34,457.18],[1034.56,455.57],[1058.79,447.49]' # 移除所有括号,得到逗号分隔的纯数值字符串 cleaned_str = points.replace('[', '').replace(']', '') # 读取数值并重塑为2列的二维数组 points_array = np.fromstring(cleaned_str, sep=',').reshape(-1, 2) print(points_array.shape) # 输出 (27, 2) print(points_array.dtype) # 输出 float64
方法三:用正则表达式提取所有数值
通过正则匹配提取所有浮点数,再转为数组:
import re import numpy as np points = '[1078.17,436.18],[1089.48,413.57],[1092.71,389.35],[1091.09,365.12],[1089.48,337.67],[1073.32,316.67],[1057.17,295.68],[1036.18,282.75],[1011.95,279.52],[987.73,273.06],[961.89,273.06],[937.66,276.29],[913.43,281.14],[894.05,297.29],[880.60,316.70],[874.20,343.10],[871.44,371.58],[868.21,395.81],[868.21,421.65],[887.59,437.80],[911.82,444.26],[936.04,449.11],[960.27,452.34],[984.50,453.95],[1010.34,457.18],[1034.56,455.57],[1058.79,447.49]' # 匹配所有带小数点的数值 nums = re.findall(r'\d+\.\d+', points) # 转为float列表后重塑为27×2数组 points_array = np.array(list(map(float, nums))).reshape(-1, 2) print(points_array.shape) # 输出 (27, 2) print(points_array.dtype) # 输出 float64
为什么你之前的方法失败?
float(points):float仅能转换单个数值字符串,无法解析复合坐标结构,因此抛出ValueError。np.float:这是np.float64的旧别名,已被弃用,且同样只能处理单个数值,不能解析整个字符串。np.astype:这是numpy数组的方法,你还未将字符串转为数组就调用,自然无效。
内容的提问来源于stack exchange,提问作者FNM
相关产品推荐
相关产品推荐

