numpy基本操作3

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)

  

原文地址:https://www.cnblogs.com/boost/p/14320600.html