数据分割时遇到一些list方面问题,在此记录,谨防下次出现类似错误!
# -*- coding: utf-8 -*-
from numpy import *
import operator
from os import listdir
# x,y=getDataSet('iris.data.txt',4)
#tr1,tr2,ts1,ts2 = dataDiv(x,y)
def getDataSet(filename,numberOfFeature): #将数据集读入内存
fr = open(filename)
numberOfLines = len(fr.readlines()) #get the number of lines in the file file.readlines()是把文件的全部内容读到内存,并解析成一个list
returnMat = zeros((numberOfLines,numberOfFeature)) #prepare matrix to return 3代表数据集中特征数目###
classLabelVector = [] #prepare labels return
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip() #strip() 参数为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')
listFromLine = line.split(',') #split 以什么为标准分割一次 分成数组中的每个元素
returnMat[index,:] = listFromLine[0:numberOfFeature]
#classLabelVector.append(int(listFromLine[-1])) #append() 方法向列表的尾部添加一个新的元素
if listFromLine[-1] == 'Iris-setosa' :
classLabelVector.append(1)
elif listFromLine[-1] == 'Iris-versicolor' :
classLabelVector.append(2)
else:
#elif listFromLine[-1] == 'Iris-virginica' :
classLabelVector.append(3)
index += 1
return returnMat,classLabelVector
def dataDiv(inMat,classVector):
#注意!!!!!!! trainData[i,:] = inMat[i,:] list类型这样操作错误
# TypeError: list indices must be integers, not tuple
#访问二维数组inMat的第i行 不能写成inMat[i,:]是错误的;正确应是inMat[i][:],
# 而numpy中定义的array变量可以通过inMat[i,:]访问 注意list和array区别
# 鸢尾花数据集共三类,每类50个数据,50(35训练集 / 15测试集)
#方法一
# trainData = []
# trainLabel = []
# testData = []
# testLabel = []
# for i in range(0,35) :
# trainData.append(inMat[i][:])
# trainLabel.append(classVector[i])
# for i in range(0,35) :
# trainData.append(inMat[50+i][:])
# trainLabel.append(classVector[50+i])
# for i in range(0,35) :
# trainData.append(inMat[100+i][:])
# trainLabel.append(classVector[100+i])
#
# for i in range(0,15) :
# testData.append(inMat[35+i][:])
# testLabel.append(classVector[35+i])
# for i in range(0,15) :
# testData.append(inMat[85+i][:])
# testLabel.append(classVector[85+i])
# for i in range(0,15) :
# testData.append(inMat[135+i][:])
# testLabel.append(classVector[135+i])
# 方法二
trainData = zeros((105,4))
trainLabel = zeros((105,4))
testData = zeros((45,4))
testLabel = zeros((45,4))
index = 0
trindice = range(0,35)+range(50,85)+range(100,135)
tsindice = range(35,50)+range(85,100)+range(135,150)
#不能写成 [range(0,35)+range(50,85)+range(100,135)] 不能加两个方括号
# 比如 [range(0,5)+range(8,10)] 代表 一个list类型变量 size=1 里面存了一个7维list
# range(0,5)+range(8,10) 代表 一个list类型变量 size=7
#ValueError: could not broadcast input array from shape (105,4) into shape (4)
for i in trindice :
trainData[index] = inMat[i]
trainLabel[index] = classVector[i]
index+=1
index = 0
for i in tsindice :
testData[index] = inMat[i]
testLabel[index] = classVector[i]
index+=1
#方法一和方法二实现的功能一致 但数据存放格式存在差别,方法一存放为list类型,方法二存放为arry类型
return trainData,trainLabel,testData,testLabel