numpyNaN

numpyNaN

nan(NAN,Nan):not a number表示不是一个数字

什么时候numpy中会出现nan:

  1. 当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
  2. 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷

什么时候回出现inf包括(-inf,+inf)

  1. 比如一个数字除以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.]]
posted @ 2024-03-05 16:55  钰见梵星  阅读(14)  评论(0编辑  收藏  举报