阅读 317

Numpy 基础入门(二) - 索引、切片与随机数

Anaconda的基本用法

按照上篇文章,相信大家都安装好了Anaconda,有朋友在留言区留言希望出一篇关于Anaconda的使用教程,其实Anaconda的基本使用非常简单,基本无需教程。

在windows下安装好Anaconda后,在所有程序中可以看到Anaconda下有以下几个组件:

  • Anaconda Navigator:用于管理工具包和环境的图形界面。

  • Anaconda Prompt:用于管理包和环境的命令行界面。

  • Jupyter Noterbook:基于Web的交互式计算环境,用于展示数据分析的过程,并且生成容易阅读的文档。

  • Spyder:Python集成开发环境,布局类似于Matlab。

    我们学习主要使用的是第三个Jupyter Noterbook。

这里简单普及一下常用的Anaconda命令(虽然我也不经常用)。

  • 查看软件版本号

python --version #查看Python版本 conda --version #查看conda的版 复制代码

  • 添加镜像

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 复制代码

  • 更新conda

conda upgrade --all 复制代码

  • 查看已经安装的packages

conda list conda install [package name] #安装package,安装在默认的Python环境中 复制代码

新手入门建议只安装Anaconda,可以省去很多不必要的麻烦,以上就是Anaconda的基本使用,欢迎大家在留言区补充。

Numpy索引及切片

纠正下上一篇的错误:

# 正确的导入方式 import numpy as np 复制代码

numpy的索引方式和Python中的列表索引相似,这里主要介绍普通数组索引/切片和布尔型数组的索引/切片。

一维数组的索引/切片

一维数组的索引和切片和Python中的列表相同,索引都是从0开始,切片都是左闭右开。

import numpy as np ar = np.arange(20) # 输出ar的第4个值 print(ar[3]) # 输出ar的前四个值 print(ar[:4]) >>> 4 [0 1 2 3] 复制代码

多维数组的索引/切片

二维数组可以理解为两个一维数组横向堆叠在一起,所只要分别取对应索引即可。

 import numpy as np ar = np.arange(16).reshape(4,4) # 二维数组索引遵照先行后列(有以下两种写法) # 选取第二行第二列的值 print(ar[2][2]) print(ar[2,2]) # 二维数组切片 # 取出前两行的值 print(ar[:2]) # 取出前两行后两列的值 print(ar[:2,2:]) >>> [[ 0  1  2  3]  [ 4  5  6  7]  [ 8  9 10 11]  [12 13 14 15]] 10 10 [[0 1 2 3]  [4 5 6 7]] [[2 3]  [6 7]] 复制代码

三位数组的索引、切片的取值方式相当与二维数组的进化版。

import numpy as np ar = np.arange(12).reshape(3,2,2) print(ar) # 三维数组索引遵照先维度后行再列 print(ar[2][0][1]) print(ar[2,0,1]) # 切片 # 获取第一个数组的第一行的第一列的数 print(ar[:1,:1,:1]) >>> [[[ 0  1]   [ 2  3]]  [[ 4  5]   [ 6  7]]  [[ 8  9]   [10 11]]] [[[0]]] 9 9 复制代码

布尔型的索引及切片

布尔型数组的使用是本片文章的重点。

# 简单展示一下布尔型的一维数组长啥样 i = np.array([True,False,True]) j = np.array([True,True,False,False]) print(i) print(j) >>> [ True False  True] [ True  True False False] 复制代码

而我们经常见到的是这样的:

ar = np.arange(12).reshape(3,4) print(ar) print(ar>5) >>> [[ 0  1  2  3]  [ 4  5  6  7]  [ 8  9 10 11]]  [[False False False False]  [False False  True  True]  [ True  True  True  True]] 复制代码

当我们需要筛选出ar中大于3的值,就可以使用布尔值进行筛选,如下:

ar = np.arange(12).reshape(3,4) print(ar[ar>3]) >>> [ 4  5  6  7  8  9 10 11] 复制代码

Numpy随机数
均匀分布和正态分布

以均匀分布和正态分布的方式生成随机数

# numpy.random.rand() 生成一个0-1的随机浮点数或N维浮点数 --均匀分布 a = np.random.rand() b = np.random.rand(4,4) print(a) print(b) >>> 0.5544023939180306 [[0.46387648 0.97345876 0.12059175 0.7565951 ]  [0.30192996 0.76633208 0.20107761 0.09315875]  [0.79347118 0.26714404 0.08628158 0.72510313]  [0.06606087 0.93260038 0.90268201 0.90941348]] 复制代码

以正太分布的方式生成随机数

# numpy.random.randn() 生成一个0-1的随机浮点数或N维浮点数 --正态分布 a = np.random.randn() b = np.random.randn(4,4) print(a) print(b) >>> 0.26901442604096687 [[ 0.40261375 -0.23541184  0.96607489 -1.11253043]  [-0.31670703  0.05841136 -0.01862511  1.72597729]  [ 0.17052799  1.03537825 -0.94375417  1.32484928]  [ 0.132761    0.44950533  0.44131534 -0.11319535]] 复制代码

按照上面的写法相信大家对与.randn()和.rand()的认识还不够清晰,这里用可视化的方式展示一下:

#平均分布 # numpy.random.rand() 生成一个0-1的随机浮点数或N维浮点数 --均匀分布 data1 = np.random.rand(500) data2 = np.random.rand(500) #正态分布 # numpy.random.randn() 生成一个浮点数或N维浮点数  --正态分布 data3 = np.random.randn(500) data4 = np.random.randn(500) import matplotlib.pyplot as plt % matplotlib inline plt.scatter(data1,data2) plt.scatter(data3,data4) 复制代码

这是随机分布的图样:

plt.scatter(data1,data2)

这是正态分布的图样:

plt.scatter(data3,data4)

可以看到正态分布和随机分布的成像还是有较大不同的,当然这里只是加深大家对.randn()和.rand()的认识,可视化再之后会进一步学习。

Numpy随机数的其他用法
#随机整数 print(np.random.randint(2)) #在2-10之间生成随机整数 print((np.random.randint(2,10))) # 在0-10之间生成10个整数 print((np.random.randint(10,size=10))) # 在0-10之间生成包含10个元素的二维数组 print(np.random.randint(10,size=(2,5))) # 在10-50之间生成包含10个元素的二维数组 print(np.random.randint(10,50,size=(2,5))) 复制代码

巩固练习

  1. 创建2个包含10个元素的正太分布一维数组

  2. 请按照要求创建数组ar,再将ar[:2,:2]的值改为[0,1)的随机数

mark

  1. 按照要求创建数组,通过索引,其ar[4]、ar[:2,3:]、ar[3][2]分别是多少

mark

  1. 按照要求创建数组,筛选出元素值大于5的值并生成新的数组

mark


作者:咸鱼学Python
链接:https://juejin.cn/post/7033188868736155684

 伪原创工具 SEO网站优化  https://www.237it.com/ 


文章分类
人工智能
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐