numpyNaN
nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
- 当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
- 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)
- 比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf
import numpy as np
a = np.inf
print(type(a))
b = np.nan
print(type(b))
<class 'float'>
<class 'float'>
# 两个nan是不相等的
print("nan==nan:", np.nan==np.nan)
print("nan!=nan:", np.nan!=np.nan)
print("*"*50)
t = np.arange(24).reshape(4, 6)
t[:,0] = 0
print(t)
# 统计t中非0的元素个数
print(np.count_nonzero(t))
print("*"*50)
# 设置nan之前要确保数组是float格式
t = t.astype("float")
t[2, 3] = np.nan
print(t)
# 统计数组中nan的数量
t1 = (t!=t)
print(t1)
print(np.count_nonzero(t1))
# 求nan数量也可以直接写成
print(np.count_nonzero(t!=t))
nan==nan: False
nan!=nan: True
**************************************************
[[ 0 1 2 3 4 5]
[ 0 7 8 9 10 11]
[ 0 13 14 15 16 17]
[ 0 19 20 21 22 23]]
20
**************************************************
[[ 0. 1. 2. 3. 4. 5.]
[ 0. 7. 8. 9. 10. 11.]
[ 0. 13. 14. nan 16. 17.]
[ 0. 19. 20. 21. 22. 23.]]
[[False False False False False False]
[False False False False False False]
[False False False True False False]
[False False False False False False]]
1
1
# 判断一个值是否是nan
print(np.isnan(t))
# 那么当然也可以通过这种方式来求nan的数量
np.count_nonzero(np.isnan(t))
[[False False False False False False]
[False False False False False False]
[False False False True False False]
[False False False False False False]]
1
t2 = np.arange(12).reshape((3, 4))
print(t2)
# 求和
print(np.sum(t2))
# 求某一个维度的和
# 求每一行的和
print(np.sum(t2, axis=0))
# 求每一列的和
print(np.sum(t2, axis=1))
print("*"*50)
print(t)
# nan和任何值计算都是nan
print(np.sum(t))
print(np.sum(t, axis=0))
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
66
[12 15 18 21]
[ 6 22 38]
**************************************************
[[ 0. 1. 2. 3. 4. 5.]
[ 0. 7. 8. 9. 10. 11.]
[ 0. 13. 14. nan 16. 17.]
[ 0. 19. 20. 21. 22. 23.]]
nan
[ 0. 40. 44. nan 52. 56.]
假如在数据中遇到了nan该如何处理呢?
在一组数据中单纯的把nan替换为0并不合适。全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行。
# 统计函数
t = np.arange(1, 25).reshape(4, 6)
print(t)
# 求总和
print("sum:")
print(t.sum())
# 求某一维度的总和
print(t.sum(axis=0))
# 求均值, 受离群点的影响较大
print("mean:")
print(t.mean())
print(t.mean(axis=0))
# 求中值
print("median:")
print(np.median(t))
print(np.median(t, axis=0))
# 求最大值
print("max")
print(t.max())
print(t.max(axis=0))
# 求最小值
print("min")
print(t.min())
print(t.min(axis=0))
# 求极值, 即最大值和最小值之差
print("ptp")
print(np.ptp(t))
print(np.ptp(t, axis=0))
# 求标准差
# 标准差是一组数据平均值分散程度的一种度量, 反映出数据的波动稳定情况, 越大表示波动越大, 约不稳定
# 一个较大的标准差, 代表大部分数值和其平均值之间差异较大
# 一个较小的标准差, 代表这些数值较接近平均值
print("std")
print(t.std())
print(t.std(axis=0))
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]
[13 14 15 16 17 18]
[19 20 21 22 23 24]]
sum:
300
[40 44 48 52 56 60]
mean:
12.5
[10. 11. 12. 13. 14. 15.]
median:
12.5
[10. 11. 12. 13. 14. 15.]
max
24
[19 20 21 22 23 24]
min
1
[1 2 3 4 5 6]
ptp
23
[18 18 18 18 18 18]
std
6.922186552431729
[6.70820393 6.70820393 6.70820393 6.70820393 6.70820393 6.70820393]
# nan缺失值填充均值
t1 = np.arange(12).reshape((3, 4)).astype("float")
t1[1, 2:] = np.nan
print(t1)
print("*"*50)
# 遍历每一列并计算每一列的nan数量
for i in range(t1.shape[1]):
temp_col = t1[:,i]
nan_num = np.count_nonzero(temp_col != temp_col)
# 若存在nan, 则求不含nan的均值, 并将nan赋值为均值
if nan_num != 0:
temp_not_nan_col = temp_col[temp_col == temp_col]
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
print(t1)
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]
**************************************************
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]