TSNE报错ValueError: setting an array element with a sequence的解决咨询
解决TSNE传入含嵌套数组/字符串的numpy数组报错问题
问题根源
你的numpy数组arr混合了字符串和嵌套子数组,而TSNE要求输入是纯数值型的二维数组(每行对应一个样本,每列对应一个特征)。这种混合结构会导致sklearn无法正确解析数据,从而抛出ValueError: setting an array element with a sequence错误。
从你给出的arr示例'00012_0' array([...]) 'Resnet' 'Lime' 'Real'可以看出,每行数据里既有单个字符串值,又有数组对象,完全不符合TSNE的输入规范。
解决步骤
1. 分离特征与元数据
回到原始DataFrameresult,先明确两类数据:
- 数值特征列:用来做TSNE降维的核心数据(即你示例中的嵌套数组内容)
- 元数据列:用来后续绘图区分样本的标签(如
'Resnet'、'Lime'这类字符串)
2. 代码修改示例
步骤1:展开嵌套特征列(如果存在)
如果你的DataFrame里有一列是嵌套数组(比如列名是feature_array),先将其展开为独立的数值列:
import pandas as pd # 把嵌套数组列展开为多列数值特征 feature_df = pd.DataFrame(result['feature_array'].tolist(), index=result.index) # 合并原数据的元数据列和展开后的特征列 processed_df = pd.concat([result.drop('feature_array', axis=1), feature_df], axis=1)
步骤2:提取纯数值特征执行TSNE
只选择数值型特征传入TSNE,元数据列留作绘图使用:
from sklearn.manifold import TSNE # 提取所有数值型特征列 X = processed_df.select_dtypes(include=['float64', 'int64']).values # 执行TSNE降维 n_components = 2 tsne_result = TSNE(n_components).fit_transform(X) # 将降维结果合并回原数据,方便后续绘图 processed_df['tsne_x'] = tsne_result[:, 0] processed_df['tsne_y'] = tsne_result[:, 1]
步骤3:用seaborn绘图
利用元数据列(如model、method)对样本分组上色:
import seaborn as sns import matplotlib.pyplot as plt sns.scatterplot(data=processed_df, x='tsne_x', y='tsne_y', hue='model', style='method') plt.show()
3. 关键注意事项
- TSNE输入必须是纯数值二维数组,禁止混入字符串、嵌套数组等非数值类型
- 元数据(标签、分类信息)不要传入TSNE,仅用于绘图阶段区分样本
- 如果原始DataFrame已经是分散的数值特征列,直接用
select_dtypes提取即可,无需展开嵌套数组
内容的提问来源于stack exchange,提问作者ccragusa
相关产品推荐
相关产品推荐

