NumPy最详细入门笔记

写在前面:这篇笔记是由本人原创,兄弟萌如果觉得不错的话,可以点个关注或收藏,方便以后查阅呀。

文章目录

前言

个人建议:想要学习好一个深度学习框架,无论是TensorFlow还是PyTorch,最好先学习一下NumPy库,因为这两个框架都是基于NumPy实现的,例如TensorFlow核心数据单位张量就是按NumPy数组的方式进行切片和重构的。学习好NumPy,特别是NumPy数组的切片和广播规则,可以为学习TensorFlow或PyTorch打下良好的基础,因此在这个暑假期间,我在NumPy 中文学习了NumPy。为了总结这段时间的学习成果,遂写下了这篇笔记,同时也方便今后查阅。

NumPy库可以概括为一个对象、两个功能。一个对象是指多维数组(ndarray),两个功能是指切片和广播功能。因此这篇笔记也是围绕着ndarray的切片和广播功能展开的。
安装NumPy库:
pip install numpy -i 镜像源URL
使用之前需导入NumPy库:
import numpy as np
from numpy import *

一、创建ndarray

1. 直接创建

即将PyThon列表或者元组转换为ndarray。
np.array(pylist) 或者 np.array(pytuple)
显示指定数据类型:np.array(pylist, dtype = np.float64或np.int64)
np.array([1, 2, 3]) 创建了一个一维数组
np.array([[1, 2, 3],[4, 5, 6]]) 创建了一个二维数组
pylist是几维嵌套列表,返回的就是几维数组,特别地,当pylist是一个数时,返回的也是一个数,但它的类型仍然是numpy.ndarray类型,即是0维数组。
在这里插入图片描述

2. 快捷创建:使用NumPy功能函数创建

这些函数均可以显示指定数据类型:dtype = np.float64\np.int64\np.int32\bool

2.1 np.zeros()函数

np.zeros(()) 创建0.0对应的0维数组
np.zeros((n)) 创建包含n个0.0的一维数组
np.zeros((m, n)) 创建包含m行,n列,元素是0.0的二维数组
np.zeros((m, n), dtype = bool) 创建包含m行,n列,元素是False的布尔二维数组

2.2 np.ones()函数

np.ones(()) 创建1.0对应的0维数组
np.ones((n)) 创建包含n个1.0的一维数组
np.ones((m, n))创建包含m行,n列,元素是1.0的二维数组
np.ones((m, n), dtype = bool) 创建包含m行,n列,元素是True的布尔二维数组

2.3 np.eye()函数

np.eye(n)或np.eye(n, n) 返回n阶单位矩阵(n * n的二维数组)。

2.4 np.arange()函数

按照步长创建一个介于[start, end)前闭后开区间的一维数组。
np.arange(start, end, step) 默认从0开始,步长为1,即start = 0, step = 1。
如:np.arange(5)等价于np.arange(0, 5, 1),返回一个一维数组[0, 1, 2, 3, 4]

2.5 np.linspace()函数

按照元素个数创建一个包含n个元素的一维数组,这n个元素均分[start, end]闭区间。
np.linspace(start, end, n)
如:np.linspace(0, 2 * np.pi, 5) 返回一个一维数组[0, π/2, π,3π/2, 2π]

2.6 np.repeat()函数

2.6.1 不指定轴索引重复

np.repeat(a, n) n代表重复的次数,始终返回一个一维数组。

2.6.1.1 a是一个标量

在这里插入图片描述

2.6.1.2 a是一个向量

先重复向量第一个元素n次,再重复向量第二个元素n次…
在这里插入图片描述

2.6.1.3 a是一个二维数组

先重复第一行第一个元素n次,再重复第一行第二个元素n次…,再重复第二行第一个元素n次,再重复第二行第二个元素n次…
在这里插入图片描述

2.6.2 指定轴索引重复

np.repeat(a, 列表, axis = 轴索引) 列表list的每一个元素代表对应行或列重复的次数,返回一个同型重复数组。
这里list的长度一定要与沿指定轴的长度相同。
在这里插入图片描述

2.7 np.full()函数

np.full((), x) 返回0阶数组,元素为x。
np.full((n), x) 返回1阶数组,元素均为x。
np.full((m, n), x) 返回2阶数组,元素均为x。
np.full((m, n), True, dtype = bool) 返回2阶布尔数组,元素均为True。
np.full((m, n), np.nan) 返回2阶布尔数组,元素均为nan。

2.8 np.tile()函数

tile是砖瓦的意思,即一个个瓦片,有重复的引申含义。
格式:np.tile(a, 形状元组reps)
数组a的维度为a.ndim,形状元组reps的长度为d

2.8.1 a.ndim < d

此时高位扩充数组a的形状至d维,即高位填充1。如:a = np.array([1, 2, 3]),a.shape = (3,),np.tile(a, (2, 2)),此时扩充a.shape = (1, 3),a为[[1, 2, 3]],然后在按照形状元组reps(2, 2)复制扩充后的二维数组a。
在这里插入图片描述

2.8.2 a.ndim > d

此时高位扩充形状元组reps至a.ndim维,即高位填充1。如:a = np.array([[1, 2, 3], [4, 5, 6]]),a.shape = (2, 3),np.tile(a, (2,)),此时扩充reps = (1, 2),然后在按照扩充后的形状元组reps(1, 2)复制二维数组a。
在这里插入图片描述

2.9 np.empty()函数

np.empty((m, n)) 返回2阶数组,初始内容随机,取决于内存状态。

2.10 np.empty_like()函数

np.empty(a) 返回一个与数组a同型的数组,初始内容随机,取决于内存状态。

2.11 创建随机ndarray

设置随机种子:np.random.seed(n)
如设置种子为100,np.random.seed(100)

2.11.1 np.random.random()函数

np.random.random() 返回介于0~1之间的随机小数
np.random.random(()) 返回与介于0~1之间随机小数对应的0维数组
np.random.random((n)) 返回包含n个介于0~1之间随机小数的一维数组
np.random.random((m, n)) 返回包含m行,n列,元素是介于0~1之间随机小数的二维数组

2.11.2 np.random.uniform()函数

np.random.uniform(min, max) 返回介于min~max开区间之间的随机小数
np.random.uniform(min, max, ()) 返回与介于min~max开区间之间随机小数对应的0维数组
np.random.uniform(min, max, (n)) 返回包含n个介于min~max开区间之间随机小数的一维数组
np.random.uniform(min, max, (m, n)) 返回包含m行,n列,元素是介于min~max开区间之间随机小数的二维数组

2.11.3 np.random.randint()函数

np.random.randint(n1, n2, size = ())返回由介于[n1, n2)前闭后开之间的随机整数对应的()0维数组。
np.random.randint(n1, n2, size = (n)) 返回由介于[n1, n2)前闭后开之间的随机整数组成的(n,)一维数组。
np.random.randint(n1, n2, size = (m, n)) 返回由介于[n1, n2)前闭后开之间的随机整数组成的(m, n)二维数组。

2.11.4 np.random.randn()函数

从标准正态分布总体中取样。
np.random.randn() 返回一个0维数组。
np.random.randn(n) 返回一个一维数组,长度为n。
np.random.randn(m, n) 返回一个二维数组(m, n)。
np.random.randn(n1, n2, n3, ...) 返回一个多维数组。

2.11.5 np.random.normal()函数

np.random.normal(loc = 0.0, scale = 1.0, size = None) 从指定正态分布中取样,默认为标准正态分布。
np.random.normal(mu, sigma, n) 返回一个一维数组,长度为n。
np.random.normal(mu, sigma, size = (m, n)) 返回一个二维数组(m, n)
np.random.normal(mu, sigma, size = (n1, n2, n3, ...)) 返回一个多维数组。

2.11.6 np.random.choice()函数

概率抽样,按指定概率生成一组序列。
如:从['cat1', 'cat2', 'cat3']中取值,生成一组序列(长度为150的一维数组),对应类别概率是[0.5, 0.25, 0.25]
步骤1:catage = np.array(['cat1', 'cat2', 'cat3'])
步骤2:np.random.choice(catage, size = 150, p = [0.5, 0.25, 0.25])

二、ndarray属性和方法

假设a 是一个二维数组,即a = np.array([[1, 2, 3], [4, 5, 6]])

1. 查看ndarray类型

type(a)
返回numpy.ndarray

2. ndarray元素类型

a.dtype
返回int32

3. ndarray元素个数

a.size
返回6,即n1(2) * n2(3)

4. ndarray形状

a.shape 返回由每一维的维界组成的形状元组(2, 3)。
如:特别地,由一个数封装的0维数组的形状是空元组。
在这里插入图片描述

5. ndarray维度

a.ndim
返回维度2。

6. ndarray单元素所占内存空间

a.itemsize
返回一个整数所占内存大小4,单位为字节Byte。

7. ndarray对象所占内存空间

a.nbytes
返回整个数组对象所占的内存空间24,即a.size * a.itemsize

8. ndarray对象转置属性

a.T
特殊地,一维数组的转置a.T仍是一个一维数组。

9. ndarray转换为列表

a.tolist()

10. 设置精度

a.round(n) n代表小数点后n位小数。
注意不会改变数组a本身。
在这里插入图片描述

三、ndarray运算

假设a、b是两个NumPy数组

1. 数学运算

注意:以下数学运算,除了第9个矩阵乘运算以外,其他的运算都是逐元素运算。

1.1 加

形式1:a + b
形式2:np.add(a, b)

1.2 减

形式1:a - b
形式2:np.subtract(a, b)

1.3 逐元素乘

形式1:a * b
形式2:np.multiply(a, b)

1.4 除

形式1:a / b
形式2:np.divide(a, b)

1.5 乘方:a ** n

注意:没有np.pow()

1.6 平方根

形式1:np.sqrt(a)
形式2:a ** 0.5

1.7 指数

np.exp(a)

1.8 双曲正切函数

np.tanh(x)

1.9 矩阵乘:a.dot(b)

dot product称为点积,对于低维度数组而言,点积操作可以运用到两个一维数组之间,也可以运用到一个一维数组和一个二维数组之间,也可以运用到两个二维数组之间。
形式1:a.dot(b)
形式2:np.dot(a, b)等价于a.dot(b),np.dot(b, a)等价于b.dot(a)。

1.9.1 两个一维数组dot运算

假设a = [x1, x2, x3],b = [y1, y2, y3]
那么a.dot(b) 返回一个标量scalar = x1y1 + x2y2 + x3y3。

1.9.2 一个一维数组和一个二维数组dot运算

假设a = [x1, x2, x3],b = [[y1, y2, y3], [y4, y5, y6], [y7, y8, y9]]
那么a和b dot运算后返回一个一维数组,并且a.dot(b)和b.dot(a)的结果不同。

1.9.2.1 a.dot(b)

a.dot(b)返回的是[x1y1+x2y4+x3y7, x1y2+x2y5+x3y8, x1y3+x2y6+x3y9],即令a分别与b的列向量dot运算,并将返回的标量结果作为一维数组的元素,此时一维数组元素的个数取决于b的列数。

1.9.2.2 b.dot(a)

而b.dot(a)则是令a分别与b的行向量dot运算,并将返回的标量结果作为一维数组的元素,此时一维数组元素的个数取决于b的行数。
在这里插入图片描述

1.9.3 两个二维数组dot运算

a.dot(b) 返回ab矩阵乘积,是一个二维数组。
b.dot(a) 返回ba矩阵乘积,是一个二维数组。

1.10 转置运算

形式1:a.T
形式2:np.transpose(a)

2. 比较运算

广播之后,返回一个同型的布尔型数组。

2.1 等于:a == b

2.2 不等于:a != b

2.3 其他比较运算

大于:a > b
小于:a < b

3. 逻辑运算

假设a、b是两个布尔数组

3.1 逻辑与

形式1:a & b
形式2:np.logical_and(a, b)

3.2 逻辑或

形式1:a | b
形式2:np.logical_or(a, b)

3.3 逻辑非

np.logical_not(a)

4. 统计运算

4.1 求和

形式1:a.sum(axis = 轴索引)
形式2:np.sum(a, axis = 轴索引)
返回的数组会降低一维。
当不指定轴索引时,会返回一个标量scalar。

4.2 求累计和

形式1:a.cumsum(axis = 轴索引)
形式2:np.cumsum(a, axis = 轴索引)
返回的是同型数组。

4.3 求最小值

形式1:a.min(axis = 轴索引)
形式2:np.min(a, axis = 轴索引)
形式3:np.amin(a, axis = 轴索引)
形式4:np.apply_along_axis(np.min或np.amin, arr = a, axis = 轴索引)
返回的数组会降低一维。
当不指定轴索引时,会返回一个标量scalar。

4.4 求最小值索引

形式1:a.argmin(axis = 轴索引)
形式2:np.argmin(a, axis = 轴索引)
如果最小值多次出现,返回第一次出现的位置。
如果a是多维数组且不指定轴索引,会先将a展开为一维数组,然后返回最小值在一维数组中的索引。

4.5 求最大值

形式1:a.max(axis = 轴索引)
形式2:np.max(a, axis = 轴索引)
形式3:np.amax(a, axis = 轴索引)
形式4:np.apply_along_axis(np.max或np.amax, arr = a, axis = 轴索引)
返回的数组会降低一维。
当不指定轴索引时,会返回一个标量scalar。

4.6 求最大值索引

形式1:a.argmax(axis = 轴索引)
形式2:np.argmax(a, axis = 轴索引)
如果最大值多次出现,返回第一次出现的位置。
如果a是多维数组且不指定轴索引,会先将a展开为一维数组,然后返回最大值在一维数组中的索引。

4.7 求沿轴值范围

a.ptp(axis = 轴索引)
返回沿指定轴的值范围max - min。

4.8 求均值

形式1:a.mean(axis = 轴索引)
形式2:np.mean(a, axis = 轴索引)

4.9 求中位数

只有np.mean(a, axis = 轴索引),没有a.median(axis = 轴索引)

4.10 求标准差

形式1:a.std(axis = 轴索引)
形式2:np.std(a, axis = 轴索引)

4.11 指定轴索引时的计算规则

假设a是一个n1×n2×…×ni-1×ni×ni+1×…×nn的n维数组,当指定axis = i时,np.sum(a, axis = i)返回的就是一个n1×n2×…×ni-1×ni+1×…×nn的n-1维数组b,这个数组的每一个元素值b[

很高兴你对Python的学习感兴趣!下面是一些关于黑马Python快速入门笔记: 1. Python简介:Python是一种高级编程语言,具有简洁、易读和可扩展的特点。它被广泛应用于数据分析、Web开发、人工智能等领域。 2. 安装Python:可以从Python官方网站下载并安装Python解释器。同时,推荐使用Anaconda发行版,它包含了很多常用的第三方库和工具。 3. 变量与数据类型:在Python中,可以使用变量来存储不同类型的数据。常见的数据类型包括整数、浮点数、字符串、列表、元组、字典等。 4. 控制流程:使用条件语句(if-else)、循环语句(for、while)和跳转语句(break、continue)控制程序的流程。 5. 函数与模块:函数是一段可重复使用的代码块,可以提高代码的复用性。模块是一个包含Python代码的文件,可以使用import语句导入模块并调用其中的函数。 6. 文件操作:Python提供了丰富的文件操作方法,可以读取和写入文本文件、二进制文件等。 7. 异常处理:通过异常处理机制可以捕获和处理程序中出现的错误,保证程序的稳定性。 8. 面向对象编程:Python是一种面向对象的编程语言,支持类、对象、继承等特性。面向对象编程可以更好地组织和管理代码。 9. 常用第三方库:Python拥有众多的第三方库,可以大大扩展其功能。一些常用的库包括NumPy(数值计算)、Pandas(数据分析)、Matplotlib(数据可视化)等。 以上是关于黑马Python快速入门的一些笔记,希望对你的学习有所帮助。如果有任何问题,请随时向我提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值