python-Numpy数据分析(二)

举报
brucexiaogui 发表于 2021/12/30 01:28:34 2021/12/30
【摘要】 python-Numpy数据分析(二)   利用数组进行数据处理 将条件逻辑表述为数组运算 '''利用数组进行数据处理 将条件逻辑表述为数组运算• 列表推导的局限性• 纯Python代码,速度不够快。• 无法应用于高维数组• where和where的嵌套'''import numpy as npimport numpy....

python-Numpy数据分析(二)

 

利用数组进行数据处理 将条件逻辑表述为数组运算


  
  1. '''
  2. 利用数组进行数据处理 将条件逻辑表述为数组运算
  3. • 列表推导的局限性
  4. • 纯Python代码,速度不够快。
  5. • 无法应用于高维数组
  6. • where和where的嵌套
  7. '''
  8. import numpy as np
  9. import numpy.random as np_random
  10. print('通过真值表选择元素')
  11. x_arr = np.array([1.1,1.2,1.3,1.4,1.5])
  12. y_arr = np.array([2.1,2.2,2.3,2.4,2.5])
  13. cond = np.array([True,False,True,True,False])
  14. result = [(x if c else y) for x, y, c in zip(x_arr, y_arr, cond)] # 通过列表推到实现
  15. print(result)
  16. print('np.where')
  17. print(np.where(cond, x_arr, y_arr)) # 使用NumPy的where函数
  18. print('更多where的例子')
  19. arr = np_random.randn(4,4)
  20. print(arr)
  21. print(np.where(arr>0,2,-2)) #当arr数组中的元素大于0时,设置值为2,小于0时设置值为-2
  22. print(np.where(arr > 0, 2, arr))#当arr数组中的元素大于0时,设置值为2,小于0时设置值为arr
  23. print('np.where嵌套')
  24. cond_1 = np.array([True, False, True, True, False])
  25. cond_2 = np.array([False, True, False, True, False])
  26. # 传统代码如下
  27. result = []
  28. for i in range(len(cond)):
  29. if cond_1[i] and cond_2[i]: #cond_1和cond_2都为True则赋值为0
  30. result.append(0)
  31. elif cond_1[i]:#cond_1为True则赋值为1
  32. result.append(1)
  33. elif cond_2[i]:#cond_2为True则赋值为2
  34. result.append(2)
  35. else:
  36. result.append(3)#cond_1和cond_2都为False则赋值为3
  37. print(result) #[1, 2, 1, 0, 3]
  38. # np版本代码
  39. result = np.where(cond_1 & cond_2, 0,np.where(cond_1, 1, np.where(cond_2, 2, 3)))
  40. print(result)

 

利用数组进行数据处理 数学和统计方法


  
  1. '''
  2. 利用数组进行数据处理 数学和统计方法
  3. • 数学和统计方法
  4. 类型 说明
  5. sum 对数组中全部或某轴向的元素求和。零长度的数组的sum为0。
  6. mean 算术平均数。零长度的数组的mean为NaN。
  7. std, var 分别为标准差和方差,自由度可调(默认为n)。
  8. min, max 最大值和最小值
  9. argmin 分别为最大值和最小值的索引
  10. cumsum 所有元素的累计和
  11. cumprod 所有元素的累计积
  12. '''
  13. import numpy as np
  14. import numpy.random as np_random
  15. print('求和,求平均')
  16. arr = np.arange(10).reshape(2,5)
  17. print(arr)
  18. print(arr.mean()) #算术平均值4.5
  19. print(arr.sum()) #求和45
  20. print(arr.mean(axis = 1)) # 对每一行的元素求平均 [2. 7.]
  21. print(arr.sum(0)) # 对每一列元素求和,axis可以省略。[ 5 7 9 11 13]
  22. '''
  23. cumsum:
  24. - 按列操作:a[i][j] += a[i - 1][j]
  25. - 按行操作:a[i][j] *= a[i][j - 1]
  26. cumprod:
  27. - 按列操作:a[i][j] += a[i - 1][j]
  28. - 按行操作:a[i][j] *= a[i][j - 1]
  29. '''
  30. print('cunsum和cumprod元素的累积和')
  31. arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
  32. print(arr.cumsum(0))
  33. print(arr.cumprod(1))

 

利用数组进行数据处理 用于布尔型数组的方法


  
  1. '''
  2. 利用数组进行数据处理 用于布尔型数组的方法
  3. • sum对True值计数
  4. • any和all测试布尔型数组,对于非布尔型数组,所有非0元素将会被当做True。
  5. '''
  6. import numpy as np
  7. import numpy.random as np_random
  8. print('正数求和')
  9. arr = np_random.randn(100)
  10. #print(arr)
  11. print((arr>0).sum()) #42
  12. print('对数组逻辑操作')
  13. bools = np.array([False,False,True,False])
  14. print(bools.any())# 有一个为True则返回True
  15. print(bools.all())# 有一个为False则返回False

利用数组进行数据处理 排序


  
  1. '''
  2. 利用数组进行数据处理 排序
  3. • 直接排序
  4. • 指定轴排序
  5. '''
  6. import numpy as np
  7. import numpy.random as np_random
  8. print('一维数组排序')
  9. arr = np.array([2,8,6,7,4,5])
  10. print(arr) #排序前的数组 [2 8 6 7 4 5]
  11. arr.sort() #排序后的数组 [2 4 5 6 7 8]
  12. print(arr)
  13. print('二维数组排序')
  14. arr = np.array([[2,8,6,7,4,5],[19,18,13,15,17,12]])
  15. print(arr)
  16. arr.sort(1) # 对每一行元素做排序
  17. print(arr)
  18. print('找位置在5%的数字')
  19. large_arr = np_random.randn(1000)
  20. large_arr.sort()
  21. print(large_arr[int(0.05 * len(large_arr))])

 

利用数组进行数据处理 去重以及其它集合运算


  
  1. '''
  2. 利用数组进行数据处理 去重以及其它集合运算
  3. • 去重以及其它集合运算
  4. 类型 说明
  5. unique(x) 计算x中的唯一元素,并返回有序结果。
  6. intersect1d(x, y) 计算x和y中的公共元素,并返回有序结果。
  7. union1d(x, y) 计算x和y的并集,并返回有序结果。
  8. in1d(x, y) 得到一个表述"x的元素是否包含于y"的布尔型数组
  9. setdiff1d(x, y) 集合的差,即元素在x中且不在y中
  10. setxor1d(x, y) 集合的异或,即存在于一个数组中但不同时存在于两个数组中的元素
  11. '''
  12. import numpy as np
  13. import numpy.random as np_random
  14. print('用unique函数去重')
  15. name = np.array([4,2,3,5,1,4,2])
  16. print(np.unique(name)) #结果去重并排序 [1 2 3 4 5]
  17. print('查找数组元素是否在另一数组')
  18. value = np.array([6,3,5,2,6,4,5])
  19. print(np.in1d(value,[2,3,6])) # [ True True False True True False False]

线性代数


  
  1. '''
  2. 线性代数
  3. • 常用的numpy.linalg函数 I
  4. 类型 说明
  5. diag 以一维数组的形式返回方阵的对角线(或非对角线元素),获将一维数组转换
  6. 为方阵(非对角线元素为0)。
  7. dot 矩阵乘法
  8. trace 计算对角线元素的和
  9. det 计算矩阵行列式
  10. eig 计算方阵的特征值和特征向量
  11. inv 计算方阵的逆
  12. pinv 计算矩阵的Moore-Penrose伪逆
  13. qr 计算QR分解
  14. svd 计算奇异值分解
  15. solve 解线性方程Ax = b,其中A为一个方阵。
  16. lstsq 计算Ax = b的最小二乘解
  17. '''
  18. import numpy as np
  19. import numpy.random as np_random
  20. from numpy.linalg import inv,qr
  21. print('矩阵乘法')
  22. x = np.array([[1,2,3],[4,5,6]])
  23. y = np.array([[3,2],[4,3],[5,4]])
  24. print('x.dot(y)')
  25. print(x.dot(y))
  26. print('np.dot(x,np.ones(3))')
  27. print(np.dot(x,np.ones(3)))
  28. x = np_random.randn(5,5)
  29. print(x)
  30. print('矩阵求逆')
  31. mat = x.T.dot(x)
  32. print(inv(mat)) # 矩阵求逆
  33. print(mat.dot(inv(mat)))
  34. print(mat.dot(inv(mat))) # 与逆矩阵相乘,得到单位矩阵。
  35. print('矩阵消元')
  36. print(mat)
  37. q, r = qr(mat)
  38. print(q)
  39. print(r)

随机数生成


  
  1. '''
  2. 随机数生成
  3. 类型 说明
  4. seed 确定随机数生成器的种子
  5. permutation 返回一个序列的随机排列或返回一个随机排列的返回
  6. shuffle 对一个序列就地随机乱序
  7. rand 产生均匀分布的样本值
  8. randint 从给定的上下限范围内随机选取整数
  9. randn 产生正态分布(平均值为0,标准差为1)
  10. binomial 产生二项分布的样本值
  11. normal 产生正态(高斯)分布的样本值
  12. beta 产生Beta分布的样本值
  13. chisquare 产生卡方分布的样本值
  14. gamma 产Gamma分布的样本值
  15. uniform 产生在[0, 1]中均匀分布的样本值
  16. '''
  17. import numpy as np
  18. import numpy.random as np_random
  19. from random import *
  20. print('正态分布随机数')
  21. name = np.random.normal(size=(4,4))
  22. print(name)

 

数组重塑


  
  1. '''
  2. 数组重塑
  3. reshape重塑数组
  4. • -1自动推导维度大小
  5. '''
  6. import numpy as np
  7. print("将一维数组转换为二维数组")
  8. arr = np.arange(8)
  9. print(arr.reshape((4, 2))) #将一维数组转为二维数组
  10. print(arr.reshape((4,2)).reshape((2,4))) #将二维数组行列置换
  11. print('维度大小自动推到')
  12. arr = np.arange(15)
  13. print(arr.reshape((5,-1)))
  14. print('获取维度信息并应用')
  15. other_arr = np.ones((3,5))
  16. print(other_arr.shape)
  17. print(arr.reshape(other_arr.shape))
  18. print('高维数组拉平,就是讲多维数组变为一维数组')
  19. arr = np.arange(15).reshape(5,3)
  20. print(arr.ravel()) #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]

数组的合并和拆分


  
  1. '''
  2. 数组合并和拆分
  3. '''
  4. import numpy as np
  5. import numpy.random as np_random
  6. print('连接两个二维数组')
  7. arr1 = np.array([[1, 2, 3], [4, 5, 6]])
  8. arr2 = np.array([[7, 8, 9], [10, 11, 12]])
  9. print('按行连接')
  10. print(np.concatenate([arr1,arr2],axis = 0)) # 按行连接
  11. print('按列连接')
  12. print(np.concatenate([arr1,arr2],axis = 1)) # 按列连接
  13. # 所谓堆叠,参考叠盘子。。。连接的另一种表述
  14. print('垂直stack与水平stack')
  15. print(np.vstack((arr1, arr2))) # 垂直堆叠
  16. print(np.hstack((arr1, arr2))) # 水平堆叠
  17. print('拆分数组')
  18. arr = np.arange(100).reshape(20,5)
  19. print(arr)
  20. print('水平拆分')
  21. first, second, third = np.split(arr, [1, 3], axis = 0)
  22. print('first')
  23. print(first)
  24. print('second')
  25. print(second)
  26. print('third')
  27. print(third)
  28. print('垂直拆分')
  29. first, second, third = np.split(arr, [1, 3], axis = 1)
  30. print('first')
  31. print(first)
  32. print('second')
  33. print(second)
  34. print('third')
  35. print(third)
  36. # 堆叠辅助类
  37. arr = np.arange(6)
  38. arr1 = arr.reshape((3, 2))
  39. arr2 = np_random.randn(3, 2)
  40. print('r_用于按行堆叠')
  41. print(np.r_[arr1, arr2])
  42. print('c_用于按列堆叠')
  43. print(np.c_[np.r_[arr1, arr2], arr])
  44. print('切片直接转为数组')
  45. print(np.c_[1:6, -10:-5])

元素的重复操作


  
  1. '''
  2. 高级应用 元素的重复操作
  3. • _tile 数组级别的复制
  4. • _repeat 元素级别的复制
  5. '''
  6. import numpy as np
  7. import numpy.random as np_random
  8. print('Repeat:按元素')
  9. arr = np.arange(3)
  10. print(arr.repeat(3))#将arr数组每个元素都复制3次。[0 0 0 1 1 1 2 2 2]
  11. print(arr.repeat([2,3,2]))# 将arr数组元素分别按照2,3,2次复制[0 0 1 1 1 2 2]
  12. print('Repeat,指定轴')
  13. arr = np.arange(10).reshape(5,2)
  14. print(arr)
  15. print('按行repeat')
  16. print(arr.repeat(2, axis = 0)) # 按行repeat
  17. print('按列repeat')
  18. print(arr.repeat(2, axis = 1)) # 按列repeat
  19. print('Tile: 参考贴瓷砖')
  20. print(np.tile(arr, 2))
  21. print(np.tile(arr, (2, 3))) # 指定每个轴的tile次数

 

花式索引的等价函数


  
  1. '''
  2. 花式索引的等价函数
  3. • take
  4. • put
  5. '''
  6. import numpy as np
  7. import numpy.random as np_random
  8. print('Fancy Indexing')
  9. arr = np.arange(10)*100
  10. print('arr数组\n',arr) #[ 0 100 200 300 400 500 600 700 800 900]
  11. inde = [2,4,6,7]
  12. print(arr[inde]) #[200 400 600 700]
  13. print('使用take')
  14. print(arr.take(inde))
  15. print('使用put更新内容')
  16. arr.put(inde,50)
  17. print(arr) #[ 0 100 50 300 50 500 50 50 800 900]
  18. print('take,指定轴')
  19. arr = np_random.randn(2, 4)
  20. inds = [2, 0, 2, 1]
  21. print(arr)
  22. print(arr.take(inds, axis = 1)) # 按列take

 

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/80676113

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。