python讀取鳶尾花資料集並進行訓練測試集分割
阿新 • • 發佈:2019-01-08
資料分割時遇到一些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