numpy中的nan
- 一、nan和inf
- 01 numpy中nan的注意点
- 02 numpy中常用统计函数
一、nan和inf
nan(NAN, Nan):not a number表示不是一个数字, nan是浮点类型,什么时候numpy中会出现nan:
- 当我们读取本地文件为float的时候,如果有缺失,就会出现nan
- 当做了一个不合适的计算的时候,比如无穷大(inf)减去无穷大
inf(-inf, inf):infinity inf表示正无穷,-inf表示负无穷,什么时候会出现inf(-inf, +inf)
- 一个数字除以0(python中会直接报错,numpy中是一个inf或者-inf)
如何指定一个nan或者inf呢?注意type类型是float
nan和inf
In [1]: a = np.inf
In [2]: type(a)
Out[2]: float
In [3]: a = np.nan
In [4]: type(a)
Out[4]: float
01 numpy中nan的注意点
- 两个nan是不相等的
In [1]: np.nan == np.nan
Out[1]: False
- np.nan != np.nan
In [2]: np.nan != np.nan
Out[2]: True
- 利用以上的特性,判断数组中的nan的个数
方法一:
In [3]: t
Out[3]: array([1., 2., nan])
In [4]: np.count_nonzero(t!=t)
Out[4]: 1
t!=t除了nan的地方是true为1,其余地方都是false为0,所以count_nanzero不为零的地方只有nan对应的true的值1
方法二:
In [3]: t
Out[3]: array([1., 2., nan])
In [4]: np.count_nonzero(np.isnan(t))
Out[4]: 1
np.isnan(t)和 t!=t返回的false和true的结果是一样的
- 由于2,那么如何判断一个数字是否为nan呢?通过np.isnan(a)来判断,返回bool类型比如希望把nan替换为0
In [5]: t
Out[5]: array([1., 2., nan])
In [6]: t[np.isnan(t)] = 0
In [7]: t
Out[7]: array([1., 2., 0.])
- nan和任何值计算都为nan
02 numpy中常用统计函数
在一组数据中单纯地把nan替换为0,如果替换之前的平均值大于0,替换之后的值肯定会变小,所以一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
- 求和:t.sum(axis = None)
- 均值:t.mean(axis = None) 受离群点的影响较大
- 中值:np.median(t, axis = None)
- 最大值:t.max(axis = None)
- 最小值:t.min(axis = None)
- 极值:np.ptp(t, axis = None) 即最大值和最小值值差
- 标准差:t.std(axis = None)
标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,越不稳定
默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果
数据的填充
import numpy as np
def fill_ndarray(t):
for i in range(t.shape[1]): # 遍历每一列
temp_col = t[:, i] # 当前的一列
nan_num = np.count_nonzero(temp_col != temp_col)
if nan_num != 0: # 不为0,说明当前这一列中有nan
temp_not_nan_col = temp_col[temp_col == temp_col] # 当前一列不为nan的array
# 选中当前nan的位置,把值赋值为不为nan的均值
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
return t
if __name__ == '__main__':
t = np.arange(12).reshape((3, 4)).astype("float")
t[1, 2:] = np.nan
t = fill_ndarray(t)
print(t)