上一节:数据分析——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其它实用的方法
- 获取最大值最小值的位置
- np.argmax(t,axis=0)
- np.argmin(t,axis=1)
- 创建一个全0的数组: np.zeros((3,4))
- 创建一个全1的数组:np.ones((3,4))
- 创建一个对角线为1的正方形数组(方阵):np.eye(3)
7、numpy生成随机数
8、numpy的注意点copy和view
- a=b 完全不复制,a和b相互影响
- a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
- a = b.copy(),复制,a和b互不影响