调用np.cov计算协方差矩阵报m超2维错误,为何数组不是1维?
报错根因
- 特征列提取时的维度问题:你使用
s[['A1']].to_numpy()提取单特征列时,外层嵌套了两层方括号,pandas会返回二维的DataFrame结构,转换为numpy数组后形状为(样本数量, 1),而非预期的一维向量。 - 数组堆叠后的维度溢出:将多个形状为
(N, 1)的二维特征数组合并时,np.array([A1_norm,A2_norm,A3_norm])会生成三维数组,形状为(特征数量, 样本数量, 1),而np.cov仅支持最高二维的输入,因此触发维度超限报错。
修复方案
有两种常用修复方式:
- 方式1:提取特征时直接生成一维向量
把列提取的双括号改为单括号,即s['A1'].to_numpy(),这样得到的每个特征都是形状为(样本数量,)的一维向量,堆叠后生成的数组形状为(特征数量, 样本数量),符合np.cov的输入要求。 - 方式2:对已生成的二维特征做降维处理
如果需要保留双括号的写法,可以在转numpy后调用.flatten()或.squeeze()去掉长度为1的维度,比如A1 = s[['A1']].to_numpy().flatten()。
修复后可正常运行的代码示例:
import pandas as pd import numpy as np def main(): s = pd.read_csv('A1-dm.csv') s = pca(s) def pca(s): # 提取一维特征列 A1 = s['A1'].to_numpy() A2 = s['A2'].to_numpy() A1_norm = A1/np.linalg.norm(A1) A2_norm = A2/np.linalg.norm(A2) data = np.array([A1_norm,A2_norm]) if 'A3' in s: A3 = s['A3'].to_numpy() A3_norm = A3/np.linalg.norm(A3) data = np.array([A1_norm,A2_norm,A3_norm]) # 计算协方差矩阵 covMatrix = np.cov(data,bias=True) print(covMatrix) return s main()
内容的提问来源于stack exchange,提问作者Evan Gertis
相关产品推荐
相关产品推荐

