当前位置:首页 » 《随便一记》 » 正文

100天精通Python(数据分析篇)——第50天:numpy进阶

26 人参与  2022年08月18日 08:25  分类 : 《随便一记》  评论

点击全文阅读


在这里插入图片描述

文章目录

每篇前言一、数组操作1. 查看数据形状2. 修改数组形状3. 数组和数的计算4. 数组和数组的计算5. 数组中的转置6. 数组的拼接7. 数组的行列交换8. 数组中的clip(裁剪)9. 数组中数值的修改 二、numpy常用方法1. 小技巧2. 生成随机数3. 注意点copy和view 三、书籍推荐

每篇前言

??作者介绍:Python领域优质创作者、华为云享专家、阿里云专家博主、2021年CSDN博客新星Top6

??本文已收录于Python全栈系列专栏:《100天精通Python从入门到就业》?​?​此专栏文章是专门针对Python零基础小白所准备的一套完整教学,从0到100的不断进阶深入的学习,各知识点环环相扣??订阅专栏后续可以阅读Python从入门到就业100篇文章还可私聊进两百人Python全栈交流群(手把手教学,问题解答); 进群可领取80GPython全栈教程视频 + 300本计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。??加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述
在这里插入图片描述

一、数组操作

1. 查看数据形状

```python>>> a1 = np.array([1,2,3,4,5])>>> a1array([1, 2, 3, 4, 5])>>> a1.shape(5,) # 括号内1个值表示一维数组
>>> a2 = np.array([[1,2,3,4],[5,6,7,8]])>>> a2array([[1, 2, 3, 4],       [5, 6, 7, 8]])>>> a2.shape (2, 4) # 括号2个值表示二维数组
>>> a3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])>>> a3array([[[ 1,  2,  3],        [ 4,  5,  6]],       [[ 7,  8,  9],        [10, 11, 12]]])>>> a3.shape(2, 2, 3) # 括号3个值表示三维数组

2. 修改数组形状

语句reshape(shape, order='C' )

作用:不改变数据的条件下修改形状

参数说明

shape:形状order:C-按行,‘F’-- 按列,‘A’–原顺序,‘k’ -元素在内存中的出现顺序
>>>a = np.array([[1,2,3,4],[5,6,7,8]])>>> a.reshape(4,2)array([[1, 2],       [3, 4],       [5, 6],       [7, 8]])# 再次查看数组形状发现只是临时修改      >>> a.shape(2, 4)# 可以用一个变量来接收返回值>>> b = a.reshape(4,2)>>> barray([[1, 2],       [3, 4],       [5, 6],       [7, 8]])

语句flatten( order='C')

作用:展平的数组元素并拷贝一份,顺序通常是"C风格"

注意:修改返回的数组不会对原数组产生影响

参数说明

order:‘C’-按行,‘F’–按列,‘A’–原顺序,‘k’ -元素在内存中的出现顺序
>>> c = np.array([[1, 2],[3, 4],[5, 6],[7, 8]])>>> carray([[1, 2],       [3, 4],       [5, 6],       [7, 8]])>>> c.shape(4, 2)# 方法1>>> c.reshape(c.shape[0]*c.shape[1],)array([1, 2, 3, 4, 5, 6, 7, 8])#  方法2>>> c.flatten()array([1, 2, 3, 4, 5, 6, 7, 8])

3. 数组和数的计算

numpy的广播机制造成的,在运算过程中,加减乘除的值被广播到所有的元素上面.

>>> a = np.array([[1,2,3,4,5],[6,7,8,9,10]])>>> aarray([[ 1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10]])>>> a + 1array([[ 2,  3,  4,  5,  6],       [ 7,  8,  9, 10, 11]])>>> a - 1array([[0, 1, 2, 3, 4],       [5, 6, 7, 8, 9]])>>> a * 2array([[ 2,  4,  6,  8, 10],       [12, 14, 16, 18, 20]])>>> a / 10array([[0.1, 0.2, 0.3, 0.4, 0.5],       [0.6, 0.7, 0.8, 0.9, 1. ]])

4. 数组和数组的计算

两数组相同维度下加减乘除

>>> a = np.array([[1,2,3,4,5],[6,7,8,9,10]])>>> aarray([[ 1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10]])>>> b = np.arange(11,21).reshape(2,5)>>> barray([[11, 12, 13, 14, 15],       [16, 17, 18, 19, 20]])>>> a + barray([[12, 14, 16, 18, 20],       [22, 24, 26, 28, 30]])>>> a - barray([[-10, -10, -10, -10, -10],       [-10, -10, -10, -10, -10]])>>> a * barray([[ 11,  24,  39,  56,  75],       [ 96, 119, 144, 171, 200]])>>> a / barray([[0.09090909, 0.16666667, 0.23076923, 0.28571429, 0.33333333],       [0.375     , 0.41176471, 0.44444444, 0.47368421, 0.5       ]])

二行5列 VS 一行5列

>>> a = np.arange(1,6).reshape(5,)>>> aarray([1, 2, 3, 4, 5])>>> b = np.arange(11,21).reshape(2,5)>>> barray([[11, 12, 13, 14, 15],       [16, 17, 18, 19, 20]])>>> a + barray([[12, 14, 16, 18, 20],       [17, 19, 21, 23, 25]])>>> a * barray([[ 11,  24,  39,  56,  75],       [ 16,  34,  54,  76, 100]])

2行一列 VS 2行5列

>>> a = np.arange(1,3).reshape(2,1)>>> aarray([[1],       [2]])>>> b = np.arange(11,21).reshape(2,5)>>> barray([[11, 12, 13, 14, 15],       [16, 17, 18, 19, 20]])>>> a + barray([[12, 13, 14, 15, 16],       [18, 19, 20, 21, 22]])>>> a * barray([[11, 12, 13, 14, 15],       [32, 34, 36, 38, 40]])

不同维度

>>> a = np.arange(1,13).reshape(3,4)>>> aarray([[ 1,  2,  3,  4],       [ 5,  6,  7,  8],       [ 9, 10, 11, 12]])>>> b = np.arange(1,11).reshape(2,5)>>> barray([[ 1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10]])>>> a + bTraceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: operands could not be broadcast together with shapes (3,4) (2,5)

5. 数组中的转置

转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据

>>> tarray([[ 0,  1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10, 11],       [12, 13, 14, 15, 16, 17]])>>> t.transpose()array([[ 0,  6, 12],       [ 1,  7, 13],       [ 2,  8, 14],       [ 3,  9, 15],       [ 4, 10, 16],       [ 5, 11, 17]])>>> t.swapaxes(1,0)array([[ 0,  6, 12],       [ 1,  7, 13],       [ 2,  8, 14],       [ 3,  9, 15],       [ 4, 10, 16],       [ 5, 11, 17]])>>> t.Tarray([[ 0,  6, 12],       [ 1,  7, 13],       [ 2,  8, 14],       [ 3,  9, 15],       [ 4, 10, 16],       [ 5, 11, 17]])

以上的三种方法都可以实现二维数组的转置的效果,大家能够看出来,转置和交换轴的效果一样

6. 数组的拼接

数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?
竖直拼接的时候:每一列代表的意义相同!!!否则牛头不对马嘴

如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同

>>> t1 = np.arange(0,12).reshape(2,6)>>> t1array([[ 0,  1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10, 11]])>>> t2 = np.arange(12,24).reshape(2,6)>>> t2array([[12, 13, 14, 15, 16, 17],       [18, 19, 20, 21, 22, 23]])>>> np.vstack((t1,t2)) # 竖直拼接array([[ 0,  1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10, 11],       [12, 13, 14, 15, 16, 17],       [18, 19, 20, 21, 22, 23]])       >>> np.hstack((t1,t2)) # 水平拼接array([[ 0,  1,  2,  3,  4,  5, 12, 13, 14, 15, 16, 17],       [ 6,  7,  8,  9, 10, 11, 18, 19, 20, 21, 22, 23]])

7. 数组的行列交换

>>> t = np.arange(12,24).reshape(3,4)>>> tarray([[12, 13, 14, 15],       [16, 17, 18, 19],       [20, 21, 22, 23]])>>> t[[1,2],:] = t[[2,1],:] # 行交换>>> tarray([[12, 13, 14, 15],       [20, 21, 22, 23],       [16, 17, 18, 19]])>>> t[:,[0,2]] = t[:,[2,0]] # 列交换>>> tarray([[14, 13, 12, 15],       [22, 21, 20, 23],       [18, 17, 16, 19]])

8. 数组中的clip(裁剪)

>>> t = np.arange(0,20).reshape(5,4)>>> tarray([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15],       [16, 17, 18, 19]])>>> t.clip(9,10) # 小于9的修改为9,大于10的修改为10array([[ 9,  9,  9,  9],       [ 9,  9,  9,  9],       [ 9,  9, 10, 10],       [10, 10, 10, 10],       [10, 10, 10, 10]])

9. 数组中数值的修改

>>> t = np.arange(0,20).reshape(5,4)>>> tarray([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15],       [16, 17, 18, 19]])>>> t[0,0] = 100>>> tarray([[100,   1,   2,   3],       [  4,   5,   6,   7],       [  8,   9,  10,  11],       [ 12,  13,  14,  15],       [ 16,  17,  18,  19]])>>> t[:,0:2] = 0>>> tarray([[ 0,  0,  2,  3],       [ 0,  0,  6,  7],       [ 0,  0, 10, 11],       [ 0,  0, 14, 15],       [ 0,  0, 18, 19]])>>> # 把数组中小于20的数全部修改为0>>> t[t<20] = 0>>> tarray([[0, 0, 0, 0],       [0, 0, 0, 0],       [0, 0, 0, 0],       [0, 0, 0, 0],       [0, 0, 0, 0]])>>> t[t==0] = 1 # 等于0的都修改为1>>> tarray([[1, 1, 1, 1],       [1, 1, 1, 1],       [1, 1, 1, 1],       [1, 1, 1, 1],       [1, 1, 1, 1]])   

二、numpy常用方法

1. 小技巧

1)获取最大值最小值的位置

# 一维数组>>> t1array([11, 12, 13, 14, 15, 16, 17, 18, 19])>>> np.argmax(t1,axis=0) #返回最大值索引8>>> np.argmin(t1,axis=0) #返回最小值索引0# 多维数组就返回每行的最大或最小值>>> t2 = np.arange(0,16).reshape(4,4)>>> t2array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15]])>>> np.argmax(t2,axis=0)array([3, 3, 3, 3], dtype=int64)>>> np.argmin(t2,axis=0)array([0, 0, 0, 0], dtype=int64)

2)创建一个全0的数组: np.zeros((3,4))

>>> np.zeros((3,4))array([[0., 0., 0., 0.],       [0., 0., 0., 0.],       [0., 0., 0., 0.]])

3)创建一个全1的数组:np.ones((3,4))

>>> np.ones((3,4))array([[1., 1., 1., 1.],       [1., 1., 1., 1.],       [1., 1., 1., 1.]])

4)创建一个对角线为1的正方形数组(方阵):np.eye(3)

>>> np.eye(3)array([[1., 0., 0.],       [0., 1., 0.],       [0., 0., 1.]])>>> np.eye(10)array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

2. 生成随机数

方法说明
np.random.rand(d0, d1,.. dn)创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0-1
np.random.randn(d0,d1,. .dn)创建d0-dn维度的标准正态分布随机数,浮点数,平均数0,标准差1
np.random.randint(low, high,(shape)) (常用)从给定上下限范围选取随机数整数,范围是low,high,形状是shape
np.random.uniform( low, high,(size))产生具有均匀分布的小数数组,low起始值,high结束值,size形状
np.random.normal(loc, scale,(size))从指定正态分布中随机抽取样本,分布中心是loc (概率分布的均值) ,标准差是scale,形状是size
np.random.seed(s)随机数种子,s是给定的种子值。因为计算机生成的是伪随机数,所以通过设定相同的随机数种子,可以每次生成相同的随机数
>>> np.random.randint(10,20,(3,3))array([[13, 15, 18],       [18, 17, 15],       [15, 10, 12]])>>> np.random.randint(10,20,(3,3))array([[17, 12, 16],       [10, 10, 14],       [15, 14, 12]])

3. 注意点copy和view

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

三、书籍推荐

书籍展示:《Python自动化测试实战》

在这里插入图片描述


【书籍内容简介】

从自动化测试理论入手,全面地阐述自动化测试的意义及实施过程。全文以Python语言驱动,结合真实案例分别对主流自动化测试工具Selenium、Robot Framework、Postman、Python+Requests、Appium等进行系统讲解。通过学习本书,读者可以快速掌握主流自动化测试技术,并帮助读者丰富测试思维,提高Python编码能力。 京东自营:https://item.jd.com/12609791.html当当自营:http://product.dangdang.com/28496655.html

点击全文阅读


本文链接:http://zhangshiyu.com/post/44429.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1