使用sklearn/PCA将高维向量转换为2维时遭遇数据错误
解决PCA降维时的"setting an array element with a sequence"错误
问题原因
PCA的fit_transform()方法要求输入是形状为(n_samples, n_features)的二维数值型数组/矩阵,但你的DataFrame是(45129,1)的结构,vector列的每个元素是300维列表(object类型),这种嵌套的列表结构无法被PCA解析,才会抛出float() argument must be a string or a number, not 'list'和后续的序列赋值错误。
解决方案
你需要先把嵌套的列表列转换成标准的二维数值矩阵,再传入PCA处理,具体步骤如下:
1. 读取数据并转换特征矩阵
import numpy as np import pandas as pd from sklearn.decomposition import PCA # 读取原始数据 data = pd.read_parquet('1.parquet', engine='fastparquet') # 将vector列的列表转换成二维数组(核心步骤) # 方法1:用numpy直接转换 features = np.array(data['vector'].tolist()) # 方法2:用pandas展开成多列(得到DataFrame格式的特征矩阵) # features = pd.DataFrame(data['vector'].tolist()) # 验证转换后的形状:应该是(45129, 300) print(f"转换后特征矩阵形状:{features.shape}")
2. 执行PCA降维
# 初始化PCA,指定降维到2维 pca = PCA(n_components=2) # 对特征矩阵执行降维 reduced = pca.fit_transform(features) # 可选:将降维结果转成DataFrame,方便后续分析/可视化 reduced_df = pd.DataFrame(reduced, columns=['PC1', 'PC2']) print(reduced_df.head())
额外检查
转换后可以确认特征矩阵的类型,确保是数值型:
print(f"特征矩阵数据类型:{features.dtype}")
如果输出是float64或int64,就说明格式正确了。
内容的提问来源于stack exchange,提问作者xzk
相关产品推荐
相关产品推荐

