读取cosdist矩阵CSV时矩阵截断,生成5x5而非6x6的问题排查
问题:读取cosdist矩阵后生成5x5矩阵而非6x6的原因及解决办法
我正在读取一个cosdist矩阵CSV文件,矩阵示例如下:
1.0, 0.695, 0.495, 0.697, 0.669, 0.684 0.695, 1.0, 0.826, 0.42, 0.454, 0.788 0.495, 0.826, 1.0, 0.528, 0.321, 0.517 0.697, 0.42, 0.528, 1.0, 0.224, 0.536 0.669, 0.454, 0.321, 0.224, 1.0, 0.409 0.684, 0.788, 0.517, 0.536, 0.409, 1.0
使用的代码片段如下:
var = pd.read_csv('cosdist.csv', sep=",") print(var) #test-output Y20 = scipy.spatial.distance.pdist(var) print(Y20) #test-output A = pd.DataFrame(scipy.spatial.distance.squareform(Y20)) print(A) #test-output
运行代码后得到的是5x5矩阵而非所需的6x6矩阵,只有在CSV顶部添加一行才能得到正确的6x6矩阵。怀疑是pdist或squareform函数导致此问题,求原因。
矩阵结果说明
- 未添加顶部行时:生成5行5列的矩阵,与原6x6输入矩阵结构不符
- 添加顶部行后:生成正确的6行6列矩阵,和原输入矩阵结构一致
原因分析
问题根源不在pdist或squareform,而是pd.read_csv的默认行为:当CSV文件没有表头行时,pandas会自动把第一行数据当作列名(表头),导致实际读取到的数据只有后面5行(即5个样本)。pdist计算n个样本间的两两距离,会生成n*(n-1)/2个值,5个样本对应10个距离值,经squareform转换后自然得到5x5矩阵。
解决办法
读取CSV时指定header=None,告诉pandas不要将第一行当作表头,全部内容按数据行处理:
import pandas as pd import scipy.spatial.distance as dist var = pd.read_csv('cosdist.csv', sep=",", header=None) print(var) #test-output Y20 = dist.pdist(var) print(Y20) #test-output A = pd.DataFrame(dist.squareform(Y20)) print(A) #test-output
修改后会读取到完整的6行数据,pdist处理6个样本生成15个距离值,squareform转换后即可得到目标6x6矩阵。
内容的提问来源于stack exchange,提问作者j. rodes
相关产品推荐
相关产品推荐

