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

一、问题简述

在对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数组中存在的元组中的列进行切片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值