数据分析——numpy(4)

上一节:数据分析——numpy(3)
本节知识:
1、numpy中的nan和inf
2、numpy中常用统计函数
3、ndarry缺失值填充均值
4、数组的拼接
5、数组的行列交换
6、numpy其它实用的方法
7、numpy生成随机数
8、numpy的注意点copy和view

1、numpy中的nan和inf

1.1 nan、inf介绍和创建

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)

那么如何指定一个nan或者inf呢?(注意他们的type类型)

#numpy中的nan和inf
a = np.nan
b = np.inf
print(a)
print(type(a))
print(b)
print(type(b))

输出:

nan
<class 'float'>
inf
<class 'float'>

1.2numpy中的nan的注意点
1)两个nan之间不相等
2)通过nan不相等的特性,可使用count_nonzero方法判断数组中nan个数,如:

In [86]:t
Out[86]:array([1.,2.,nan])
In [87]:np.count_nonzero(t!=t)
Out[87]:1

3)isnan可判断是否为nan,且可用于替换nan

In [89]:t
Out[89]:array([1.,2.,nan])
In [90]:t[np.isnan(t)]=0
Out[90]:array([1.,2.,0.])

4)任何值和nan计算都为nan

那么问题来了,在一组数据中单纯的把nan替换为0,会带来什么样的影响?
假如原始数据中某一列的平均值为4,nan替换为0后,求平均值时被除数比原来大1,所得结果就会小于4,对应这种情况我们可以将nan替换为均值(下面会介绍均值计算方法)

2、numpy中常用统计函数

求和:t.sum(axis=None)
均值:t.mean(a,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表示数组的轴,默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

#numpy中常用统计函数
a = np.array([[1,2,3],[4,5,6]])
print(a)
print('*'*100)
print(a.sum(axis=1)) #求和
print('*'*100)
print(a.mean(axis=1)) #均值
print('*'*100)
print(np.median(a,axis=0)) #中值
print('*'*100)
print(np.ptp(a)) #极值
print('*'*100)
print(a.std()) #方差

输出:

[[1 2 3]
 [4 5 6]]
****************************************************************************************************
[ 6 15]
****************************************************************************************************
[2. 5.]
****************************************************************************************************
[2.5 3.5 4.5]
****************************************************************************************************
5
****************************************************************************************************
1.707825127659933

3、ndarry缺失值填充均值

t中存在nan值,如何操作把其中的nan填充为每一列的均值

#ndarry缺失值填充均值
t = np.array([[  0.,   1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,  np.nan,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  np.nan,  16.,  17.],
       [ 18.,  19.,  20.,  21.,  22.,  23.]])

for i in range(t.shape[1]): #shape[1]:列数

    nan_num = np.count_nonzero(t[:,i][t[:,i] != t[:,i]]) #利用nan!=nan的特性计算每一列nan个数
    if nan_num>0: #如果存在nan
        now_col = t[:,i]
        now_col_not_nan = now_col[np.isnan(now_col) == False].sum() #求非nan的和
        now_col_mean = now_col_not_nan / (t.shape[0] - nan_num) #求非nan均值
        now_col[np.isnan(now_col)] = now_col_mean #替换nan值成均值

        t[:,i] = now_col #更新t

print(t)

输出:

[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7. 12.  9. 10. 11.]
 [12. 13. 14. 11. 16. 17.]
 [18. 19. 20. 21. 22. 23.]]

4、数组的拼接

方法:vstack(竖直拼接),hstack(水平拼接)

#拼接
t1 = np.array([[  0.,   1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,  np.nan,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  np.nan,  16.,  17.],
       [ 18.,  19.,  20.,  21.,  22.,  23.]])

t2 = np.array([[  8.,   1.,   2.,   7.,   4.,   5.],
       [  6.,   7.,  np.nan,   9.,  10.,  11.],
       [ 10.,  13.,  14.,  2,  16.,  17.],
       [ 11.,  19.,  20.,  21.,  22.,  23.]])

print(np.hstack((t1,t2))) #水平拼接
print('*'*100)
print(np.vstack((t1,t2))) #垂直拼接

输出:

[[ 0.  1.  2.  3.  4.  5.  8.  1.  2.  7.  4.  5.]
 [ 6.  7. nan  9. 10. 11.  6.  7. nan  9. 10. 11.]
 [12. 13. 14. nan 16. 17. 10. 13. 14.  2. 16. 17.]
 [18. 19. 20. 21. 22. 23. 11. 19. 20. 21. 22. 23.]]
****************************************************************************************************
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7. nan  9. 10. 11.]
 [12. 13. 14. nan 16. 17.]
 [18. 19. 20. 21. 22. 23.]
 [ 8.  1.  2.  7.  4.  5.]
 [ 6.  7. nan  9. 10. 11.]
 [10. 13. 14.  2. 16. 17.]
 [11. 19. 20. 21. 22. 23.]]

5、数组的行列交换

#行列交换
a = np.arange(12).reshape(3,4)
print(a)
print('*'*100)
a[[1,2],:] = a[[2,1],:] #行交换
print(a)
print('*'*100)
a[:,[2,3]] = a[:,[1,2]] #列交换
print(a)

输出:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
****************************************************************************************************
[[ 0  1  2  3]
 [ 8  9 10 11]
 [ 4  5  6  7]]
****************************************************************************************************
[[ 0  1  1  2]
 [ 8  9  9 10]
 [ 4  5  5  6]]

6、numpy其它实用的方法

  1. 获取最大值最小值的位置
  2. np.argmax(t,axis=0)
  3. np.argmin(t,axis=1)
  4. 创建一个全0的数组: np.zeros((3,4))
  5. 创建一个全1的数组:np.ones((3,4))
  6. 创建一个对角线为1的正方形数组(方阵):np.eye(3)

7、numpy生成随机数

在这里插入图片描述

8、numpy的注意点copy和view

  1. a=b 完全不复制,a和b相互影响
  2. a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
  3. a = b.copy(),复制,a和b互不影响

猜你喜欢

转载自blog.csdn.net/qq_35526165/article/details/102577539
今日推荐