numpy导入数据集无法对列分割问题及解决方法

    科技2024-11-03  12

    文章目录

    一、问题简述二、解决办法1、dtype2、改变加载的方式 三、参考资料

    一、问题简述

    在对CM1数据集(用于defect prediction)预处理的时候,加上label一共是38个特征,前37个是数字,label是{N,Y},加载数据集后实例以元组存储在数组中,无法通过切片获取前37个特征。

    加载数据集的代码如下:

    import numpy as np from math import pi import os from sklearn import preprocessing path=os.path.split(os.path.abspath(__file__))[0] filename=path+'/cleaned-cm1.txt' dt=np.dtype([('LOC_BLANK',float),('BRANCH_COUNT',float),('CALL_PAIRS',float),('LOC_CODE_AND_COMMENT',float),('LOC_COMMENTS',float),('CONDITION_COUNT',float),('CYCLOMATIC_COMPLEXITY',float),('CYCLOMATIC_DENSITY',float),('DECISION_COUNT',float),('DECISION_DENSITY',float),('DESIGN_COMPLEXITY',float),('DESIGN_DENSITY',float),('EDGE_COUNT',float),('ESSENTIAL_COMPLEXITY',float),('ESSENTIAL_DENSITY',float),('LOC_EXECUTABLE',float),('PARAMETER_COUNT',float),('HALSTEAD_CONTENT',float),('HALSTEAD_DIFFICULTY',float),('HALSTEAD_EFFORT',float),('HALSTEAD_ERROR_EST',float),('HALSTEAD_LENGTH',float),('HALSTEAD_LEVEL',float),('HALSTEAD_PROG_TIME',float),('HALSTEAD_VOLUME',float),('MAINTENANCE_SEVERITY',float),('MODIFIED_CONDITION_COUNT',float),('MULTIPLE_CONDITION_COUNT',float),('NODE_COUNT',float),('NORMALIZED_CYLOMATIC_COMPLEXITY',float),('NUM_OPERANDS',float),('NUM_OPERATORS',float),('NUM_UNIQUE_OPERANDS',float),('NUM_UNIQUE_OPERATORS',float),('NUMBER_OF_LINES',float),('PERCENT_COMMENTS',float),('LOC_TOTAL',float),('Defective',str,1)]) # print(dt) data_original=np.loadtxt(filename,dtype=dt,comments='@',delimiter=',') print(data_original.shape) print(data_original[:3]) #最小最大规范化 min_max_scaler=preprocessing.MinMaxScaler() min_max_scaler.feature_range=(0,10) #切片 data=data_original[:,0:-1] print(data.shape)

    代码执行的结果如下:

    [Running] python -u "/Users/schillerxu/Documents/sourcecode/python/numpy_test/3.py" (344,) [( 6., 9., 2., 1., 0., 16., 5., 0.2 , 8., 2., 3., 0.6, 17., 1., 0., 24., 3., 32.54, 9.5 , 2936.77, 0.1 , 63., 0.11, 163.15, 309.13, 0.2 , 4., 8., 14., 0.16, 19., 44., 15., 15., 32., 4. , 25., 'N') (15., 7., 3., 1., 19., 12., 4., 0.13, 6., 2., 2., 0.5, 17., 1., 0., 31., 1., 38.55, 21.52, 17846.19, 0.28, 141., 0.05, 991.46, 829.45, 0.25, 3., 6., 15., 0.06, 51., 90., 32., 27., 67., 39.22, 32., 'Y') (27., 9., 1., 4., 22., 16., 5., 0.15, 8., 2., 3., 0.6, 18., 1., 0., 29., 0., 52.03, 12.33, 7914.68, 0.21, 111., 0.08, 439.7 , 641.73, 0.2 , 4., 8., 15., 0.06, 37., 74., 33., 22., 83., 47.27, 33., 'Y')] Traceback (most recent call last): File "/Users/schillerxu/Documents/sourcecode/python/numpy_test/3.py", line 15, in <module> data=data_original[:,0:-1] IndexError: too many indices for array

    可以看到,每个示例以元组存储在数组中,而且切片的时候参数过多。

    二、解决办法

    1、dtype

    我们在定义dtype的时候,定义了每列的名字以及存储的类型,同样,也可以通过每列的名字获取这列的数据。

    print(data_original['LOC_BLANK'][0:3])

    执行的效果如下: 刚好能获取第一列的数据。

    这种方法只能少量列的时候用,多了比较麻烦。

    2、改变加载的方式

    numpy.loadtxt()默认是以float存储读取的数据的,所以之前会提前自定义dtype,但是没法切片操作。为了方便,可以先以str(字符串)的形式存储数据,然后把需要的数据切片转换成需要的数据格式。

    参考代码如下:

    import sys import numpy as np path=sys.path[0] filename=path+'/cleaned-cm1.txt' data_original=np.loadtxt(filename,dtype=str,comments='@',delimiter=',') print(data_original[0]) data=data_original[:,0:-1] data=data.astype(float) print(data.shape) print(data[0])

    运行的结果如下: 已经取得前37个特征的数据。

    三、参考资料

    python – 对numpy数组中存在的元组中的列进行切片

    Processed: 0.022, SQL: 8