1. 程式人生 > >python讀取鳶尾花資料集並進行訓練測試集分割

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):    
<span style="color:#ff0000;">#注意!!!!!!!  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區別</span>

# 鳶尾花資料集共三類,每類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)   
    <span style="color:#ff0000;">#不能寫成 [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)</span>     
    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