python读取鸢尾花数据集并进行训练测试集分割

数据分割时遇到一些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


你可能感兴趣的:(python)