写在前面:这篇笔记是由本人原创,兄弟萌如果觉得不错的话,可以点个关注或收藏,方便以后查阅呀。
文章目录
- 前言
- 一、创建ndarray
- 二、ndarray属性和方法
- 三、ndarray运算
- 四、存取ndarray:切片功能
- 五、ndarray自动扩充:广播功能
- 六、NumPy加载数据
- 七、NumPy重要函数大全
-
- 1. 查看NumPy版本
- 2. np.where()函数
- 3. np.argwhere()函数
- 4. np.reshape()函数
- 5. np.linalg.solve()函数
- 6. np.linalg.norm()函数
- 7. np.concatenate()函数
- 8. np.vstack()函数
- 9. np.hstack()函数
- 10. np.r_[a, b]
- 11. np.c_[a, b]
- 12. np.intersect1d()函数
- 13. np.setdiff1d()函数
- 14. np.vectorize()函数
- 15. np.set_printoptions()函数
- 16. np.isnan()函数
- 17. np.corrcoef()函数
- 18. np.any()函数
- 19. np.all()函数
- 20. np.unique()函数
- 21. np.digitize()函数
- 22. np.searchsorted()函数
- 23. np.sort()函数
- 24. np.argsort()函数
- 25. np.clip()函数
- 26. np.ravel()函数
- 27. np.apply_along_axis()函数
- 28. np.diff()函数
- 29. np.convolve()函数
- 30. np.count_nonzero()函数
- 31. np.interp()函数
- 32. 通用函数的accumulate()方法
- 33. np.atleastxd()函数
- 八、可以使用NumPy快速处理的问题
-
- 1. 问题一
- 2. 问题二
- 3. 问题三
- 4. 问题四
- 5. 问题五
- 6. 问题六
- 7. 问题七
- 8. 问题八
- 9. 问题九
- 10. 问题十
- 11. 问题十一
- 12. 问题十二
- 13. 问题十三
- 14. 问题十四
- 15. 问题十五
- 16. 问题十六
- 17. 问题十七
- 18. 问题十八
- 19. 问题十九
- 20. 问题二十
- 21. 问题二十一
- 22. 问题二十二
- 23. 问题二十三
- 24. 问题二十四
- 25. 问题二十五
- 26. 问题二十六
- 27. 问题二十七
- 28. 问题二十八
- 29. 问题二十九
- 30. 问题三十
- 31. 问题三十一
- 32. 问题三十二
- 33. 问题三十三
- 34. 问题三十四
- 35. 问题三十五
- 36. 问题三十六
- 37. 问题三十七
- 38. 问题三十八
- 39. 问题三十九
- 40. 问题四十
- 41. 问题四十一
- 42. 问题四十二
- 43. 问题四十三
- 44. 问题四十四
- 45. 问题四十五
- 46. 问题四十六
- 47. 问题四十七
- 48. 问题四十八
- 49. 问题四十九
- 50 问题五十
- 51. 问题五十一
- 52. 问题五十二
- 53. 问题五十三
- 54. 问题五十四
- 55. 问题五十五
- 56. 问题五十六
前言
个人建议:想要学习好一个深度学习框架,无论是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[