You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CSV中存储为字符串形式的tensor转换为tensor对象?

解决字符串形式Tensor转换为Tensor对象的问题

我有一个CSV文件,其中文档嵌入的Tensor是以字符串形式存储的,示例如下:

>>> data.loc[0]['Q_emd_list']
'tensor([ 0.1210, -1.1949,  0.1806,  ...,  0.3578, -0.1209,  0.4065])'

尝试用ast.literal_eval转换时触发错误:

ValueError: malformed node or string: <_ast.Call object at 0x7fbe6203f580>

问题原因

ast.literal_eval仅支持解析Python字面量(如列表、字典、数字等),而目标字符串是tensor(...)这种函数调用形式,不属于字面量范畴,因此无法解析。

解决方案

以下是几种可行的转换方法:

方法1:字符串提取+手动转换(安全可控)

通过正则提取括号内的数值列表,再转换为Tensor:

import torch
import re

# 从CSV中获取的字符串
tensor_str = data.loc[0]['Q_emd_list']

# 提取方括号内的内容
match = re.search(r'\[(.*)\]', tensor_str)
if match:
    num_str = match.group(1)
    # 移除省略号(如果实际数据中是完整数值可跳过此步)
    num_str = num_str.replace('...', '')
    # 分割并转换为float列表
    num_list = [float(num.strip()) for num in num_str.split(',') if num.strip()]
    # 转换为Tensor
    q_emd = torch.tensor(num_list)

方法2:使用eval(简单但有风险)

eval可以直接解析函数调用,但仅当你完全信任CSV内容时使用,避免恶意代码注入:

import torch

tensor_str = data.loc[0]['Q_emd_list']
# 注意:仅适用于可信数据源
q_emd = eval(tensor_str)

方法3:正则提取所有数值(适配省略号场景)

直接提取字符串中所有数值,无需处理括号结构:

import torch
import numpy as np
import re

tensor_str = data.loc[0]['Q_emd_list']
# 提取所有浮点数(包含正负)
num_str_list = re.findall(r'-?\d+\.\d+', tensor_str)
# 转换为numpy数组再转Tensor
num_array = np.array([float(num) for num in num_str_list])
q_emd = torch.from_numpy(num_array)

方法对比

  • 方法1:安全度最高,可灵活处理格式异常(如省略号),但需要手动处理字符串逻辑。
  • 方法2:代码最简洁,但存在安全风险,禁止用于不可信数据源。
  • 方法3:无需关注括号结构,直接提取数值,适合格式统一的场景。

内容的提问来源于stack exchange,提问作者AI Sush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:15:33