python中的NAN和inf
NAN(nan):not a number 表示不是一个数字,
什么时候出现NAN呢:
当我们读取本地文件为float的时候,数据有缺失的情况下,这个缺失的数据就会被填补成NAN,还有一种情况是出现了不合理的运算:无穷大减去无穷大,无穷小减去无穷小;
inf : 表示无穷大, -inf表示无穷小。
什么时候出现inf呢:
一个数字除以0的时候。inf也是float类型。
NAN 的性质:
1. 两个NAN不相等,这个性质可以计算出一个数组中NAN的个数
t1 = np.array(np.random.uniform(1,5,(4,5))) t1[2,3] = np.nan t1[1,3] = np.nan print(np.count_nonzero(t1 == t1))
print(np.count_nonzero(t1 != t1))
#答案是18和2
2. nan和任何数值进行计算都是nan,顺便看一下怎么求均值和中值
t1 = np.array(np.random.uniform(1,5,(4,5))) t1[2,3] = np.nan t1[1,3] = np.nan print(t1) print(np.count_nonzero(t1 != t1)) #求中值和均值 means = np.mean(t1,axis=0) #每列的均值 print(means) median = np.median(t1,axis=1) #每行的中值 print(median)
做一道作业题:
把一个数组中是nan的用均值替换。
def fill_nan_use_means(t1): for i in range(t1.shape[1]): #按照列来遍历 col_temp = t1[:,i] #取出第i列 nan_num = np.count_nonzero(col_temp != col_temp) #计算出每列的nan的个数 if nan_num != 0: #如果存在nan print("#"*100) temp_not_nan_col = col_temp[col_temp == col_temp] #就把非nan的列整理出给temp_not_nan_col print(temp_not_nan_col) print("#" * 100) col_temp[np.isnan(col_temp)] = temp_not_nan_col.mean() #把是nan的位置用均值来代替 return t1 if __name__ == '__main__': t1 = np.random.randint(1,10,(4,5)).astype(float) t1[1:3,2:3] = np.nan print("*"*30,"填充前","*"*30) print(t1) t1 = fill_nan_use_means(t1) print("*" * 30, "填充后", "*" * 30) print(t1)