1. 兩個常用的函數
1.1 np.nonzero()
np.nonzero()函數返回數組中不為False(0)的元素對應的索引
a = np.array([1,2,0,3,1,0]) print(np.nonzero(a)) >>(array([0, 1, 3, 4], dtype=int64),) #返回數組中不為0元素的索引數組
a = np.array([1,2,0,3,1,0]) print(np.nonzero(a)[0]) >>[0 1 3 4 5 7] #這里要注意使用的時候如果只需要索引數組,需要在后面加上[0],這樣就只是返回索引數組 #可以和上面對比來看
1.2 np.isnan()
np.isnan()函數判斷一個數組各個元素是否為nan,並返回相同維度對應的bool數組
a = np.array([1,2,0,np.nan,3,1,0,np.nan]) print(np.isnan(a)) >>[False False False True False False False True] #返回對數組進行空值檢測的結果
類似的還有np.~isnan()函數,顧名思義就是實值檢測,對於非nan元素返回true,nan元素返回false,與isnan()函數剛好相反
2. 實現一個缺失值填充函數
在函數中我們通過上述函數實現計算同一特征非空數據的均值,並以此填充哪些空缺值
# 加載包含NaN的數據集 # 用平均值代替缺失值 def replaceNaNWithMean(): #載入數據 datMat=loadDataSet('secom.data',' ') #獲取特征維度 numFeat = shape(datMat)[1] #遍歷數據集每一個維度 for i in range(numFeat): #利用該維度所有非NaN特征求取均值 #nonzero返回非空元素的索引 #isnan和~isnan返回數組元素是否對應為空的True or False數組 meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #將該維度中所有NaN特征全部用均值替換 #.A將matrix轉化為ndarray,然后~isnan()獲得對應bool數組 #再通過nonzero()得到所有不為nan數據的索引數組 #也即第i個特征不為nan的所有元素的索引,最后通過mean對這些元素求出平均值 datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal #最后再用計算出來的平均值填充空值 return datMat #最后返回用平均值填充空缺值后的數組