如何将张量值集合转为列表并保留浮点精度与显示格式
问题
我有3组ID列表(sequence[i].id_column),打印时发现第二组列表的显示格式变成了科学计数法(比如4.2显示为4.2e+00)。我尝试把所有列表存入集合unique_values来获取唯一值,再转为张量并排序,但得到的unique_values_sorted还是科学计数法格式。想生成一个包含所有列表唯一值、且保持第一组id_column_tensor显示格式的列表。
原代码
unique_values = set() np.set_printoptions(suppress=True) torch.set_printoptions(precision=1) for i in range(start_timestep-1, start_timestep+ timestep-1): if sequence[i].x.size(0) > 0: id_column_tensor = torch.tensor(sequence[i].id_column, dtype=torch.float32) id_column_list = [float(f"{value:.4f}") if isinstance(value, float) else value for value in sequence[i].id_column] #id_column_tensor unique_values.update(id_column_tensor) print('id_column_tensor:',id_column_tensor) else: raise ValueError(f"The tensor at sequence[{i}].x is empty.") print('unique_values:',unique_values) # Convert unique values to a tensor to get unique sorted values unique_values_tensor = torch.tensor(list(unique_values)) #, dtype=torch.float32 unique_values_sorted = torch.unique(unique_values_tensor, sorted=True) print('unique_values_sorted:', unique_values_sorted)
原输出
id_column_tensor: tensor([ 12.0, 13.0, 13.1, 13.2, 14.0, 14.1, 15.0, 15.1, 16.0, 16.1, 16.2, 17.0, 17.1, 18.0, 18.1, 18.2, 19.0, 19.1, 5001.0, 5004.0, 5008.0, 5010.0]) id_column_tensor: tensor([0.0e+00, 1.0e+00, 2.0e+00, 3.0e+00, 3.1e+00, 3.2e+00, 4.0e+00, 4.1e+00, 4.2e+00, 5.0e+00, 5.1e+00, 6.0e+00, 6.1e+00, 6.2e+00, 7.0e+00, 7.1e+00, 8.0e+00, 8.1e+00, 8.2e+00, 9.0e+00, 9.1e+00, 9.2e+00, 1.0e+01, 1.1e+01, 1.1e+01, 1.1e+01, 1.2e+01, 1.2e+01, 1.3e+01, 1.3e+01, 1.4e+01, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03]) id_column_tensor: tensor([ 5.1, 6.0, 6.1, 6.2, 7.0, 7.1, 8.0, 8.1, 8.2, 9.0, 9.1, 9.2, 10.0, 11.0, 11.1, 11.2, 12.0, 12.1, 13.0, 13.1, 13.2, 14.0, 14.1, 15.0, 15.1, 16.0, 16.1, 16.2, 17.0, 17.1, 18.0, 18.1, 18.2, 19.0, 19.1, 5001.0, 5004.0, 5006.0, 5007.0, 5008.0, 5009.0, 5010.0]) unique_values: {tensor(5001.), tensor(3.1), tensor(16.1), tensor(2.), tensor(4.1), tensor(10.), tensor(16.2), tensor(13.2), tensor(16.1), tensor(5004.), tensor(5005.), tensor(13.2), tensor(6.), tensor(19.), tensor(5009.), tensor(11.1), tensor(7.), tensor(13.1), tensor(17.), tensor(8.2), tensor(9.1), tensor(11.), tensor(18.1), tensor(5006.), tensor(14.), tensor(5008.), tensor(6.2), tensor(19.1), tensor(18.), tensor(14.), tensor(11.2), tensor(7.), tensor(13.1), tensor(8.1), tensor(9.), tensor(5.), tensor(11.1), tensor(9.), tensor(5007.), tensor(14.1), tensor(6.1), tensor(5001.), tensor(5008.), tensor(18.2), tensor(4.2), tensor(8.2), tensor(5001.), tensor(12.), tensor(9.2), tensor(17.1), tensor(6.2), tensor(11.2), tensor(9.1), tensor(13.), tensor(5008.), tensor(15.), tensor(5.1), tensor(6.), tensor(5.1), tensor(5004.), tensor(16.), tensor(17.), tensor(5002.), tensor(12.1), tensor(14.1), tensor(17.1), tensor(5010.), tensor(18.), tensor(12.), tensor(9.2), tensor(6.1), tensor(7.1), tensor(15.1), tensor(8.1), tensor(5006.), tensor(5010.), tensor(14.), tensor(19.), tensor(5003.), tensor(13.), tensor(18.1), tensor(12.1), tensor(10.), tensor(12.), tensor(16.2), tensor(16.), tensor(15.1), tensor(3.), tensor(3.2), tensor(8.), tensor(5007.), tensor(15.), tensor(0.), tensor(8.), tensor(5004.), tensor(13.1), tensor(7.1), tensor(19.1), tensor(4.), tensor(18.2), tensor(1.), tensor(13.), tensor(11.)} unique_values_sorted: tensor([0.0e+00, 1.0e+00, 2.0e+00, 3.0e+00, 3.1e+00, 3.2e+00, 4.0e+00, 4.1e+00, 4.2e+00, 5.0e+00, 5.1e+00, 6.0e+00, 6.1e+00, 6.2e+00, 7.0e+00, 7.1e+00, 8.0e+00, 8.1e+00, 8.2e+00, 9.0e+00, 9.1e+00, 9.2e+00, 1.0e+01, 1.1e+01, 1.1e+01, 1.1e+01, 1.2e+01, 1.2e+01, 1.3e+01, 1.3e+01, 1.3e+01, 1.4e+01, 1.4e+01, 1.5e+01, 1.5e+01, 1.6e+01, 1.6e+01, 1.6e+01, 1.7e+01, 1.7e+01, 1.8e+01, 1.8e+01, 1.8e+01, 1.9e+01, 1.9e+01, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03, 5.0e+03])
解决方案
直接修改PyTorch打印配置并调整集合存储逻辑即可解决问题,修改后的代码如下:
unique_values = set() # 核心配置:禁用科学计数法,同时保留1位小数精度,和第一组显示格式一致 torch.set_printoptions(suppress=True, precision=1) for i in range(start_timestep-1, start_timestep + timestep - 1): if sequence[i].x.size(0) > 0: id_column_tensor = torch.tensor(sequence[i].id_column, dtype=torch.float32) # 提取张量中的数值存入集合,而非存储单个张量对象 unique_values.update(id_column_tensor.numpy().tolist()) print('id_column_tensor:', id_column_tensor) else: raise ValueError(f"sequence[{i}].x 张量为空") # 转换为张量并去重排序,显式指定类型保证一致性 unique_values_tensor = torch.tensor(list(unique_values), dtype=torch.float32) unique_values_sorted = torch.unique(unique_values_tensor, sorted=True) print('unique_values_sorted:', unique_values_sorted)
关键修改说明
- 打印选项调整:
torch.set_printoptions(suppress=True, precision=1)强制禁用科学计数法,同时设置和第一组相同的小数精度,直接解决显示格式问题 - 集合存储逻辑优化:原代码把单个张量元素存入集合,导致集合里全是小张量对象;改为提取张量的数值列表存入集合,既保证唯一值的正确性,也避免后续转换的问题
- 类型统一:转换为张量时显式指定
dtype=torch.float32,确保所有数值类型一致,避免潜在的格式转换异常
内容的提问来源于stack exchange,提问作者kami2024
相关产品推荐
相关产品推荐

