既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
array([[9, 1, 9],
[0, 3, 9],
[8, 5, 4]])
(11)随机重排列
import numpy as np
x = np.array([10, 20, 30, 40])
np.random.permutation(x) # 生产新列表,不会对原列表产生影响。
array([30, 40, 20, 10])
print(x)
np.random.shuffle(x) # 修改原列表
print(x)
[10 20 30 40]
[20 40 10 30]
(12)随机采样
- 按指定形状采样
x = np.arange(10, 25, dtype = float)
x
array([10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22.,
23., 24.])
np.random.choice(x, size=(4, 3))
array([[19., 23., 22.],
[22., 21., 13.],
[15., 21., 17.],
[14., 23., 19.]])
import numpy as np
np.random.choice(10, 10)
array([0, 0, 9, 5, 8, 5, 2, 4, 9, 8])
x = np.arange(5).reshape(1, 5)
x
x.sum(axis=1, keepdims=True)
array([[10]])
- 按概率采样
np.random.choice(x, size=(4, 3), p=x/np.sum(x))
array([[15., 21., 20.],
[23., 17., 18.],
[23., 15., 17.],
[19., 24., 22.]])
10.3 Numpy数组的性质
10.3.1 数组的属性
x = np.random.randint(10, size=(3, 4))
x
array([[5, 5, 2, 7],
[2, 3, 0, 8],
[3, 8, 1, 7]])
1、数组的形状shape
x.shape
(3, 4)
2、数组的维度ndim
x.ndim
2
y = np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y.ndim
1
3、数组的大小size
x.size
12
4、数组的数据类型dtype
x.dtype
dtype('int32')
10.3.2 数组索引
1、一维数组的索引
x1 = np.arange(10)
x1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1[0]
0
x1[5]
5
x1[-1]
9
2、多维数组的索引——以二维为例
x2 = np.random.randint(0, 20, (2,3))
x2
array([[11, 3, 11],
[ 6, 1, 5]])
x2[0, 0]
11
x2[0][0]
11
注意:numpy数组的数据类型是固定的,向一个整型数组插入一个浮点值,浮点值会向下进行取整
x2[0, 0] = 1.618
x2
array([[ 1, 3, 11],
[ 6, 1, 5]])
10.3.3 数组的切片
1、一维数组——跟列表一样
x1 = np.arange(10)
x1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1[:3]
array([0, 1, 2])
x1[3:]
array([3, 4, 5, 6, 7, 8, 9])
x1[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
2、多维数组——以二维为例
x2 = np.random.randint(20, size=(3,4))
x2
array([[14, 9, 15, 8],
[18, 8, 16, 17],
[ 0, 8, 2, 17]])
x2[:2, :3] # 前两行,前三列
array([[14, 9, 15],
[18, 8, 16]])
x2[:2, 0:3:2] # 前两行 前三列(每隔一列)
array([[14, 15],
[18, 16]])
x2[::-1, ::-1]
array([[17, 2, 8, 0],
[17, 16, 8, 18],
[ 8, 15, 9, 14]])
3、获取数组的行和列
x3 = np.random.randint(20, size=(3,4))
x3
array([[ 8, 13, 15, 7],
[19, 13, 17, 6],
[11, 2, 0, 12]])
x3[1, :] #第一行 从0开始计数
array([19, 13, 17, 6])
x3[1] # 第一行简写
array([19, 13, 17, 6])
x3[:, 2] # 第二列 从0开始计数
array([15, 17, 0])
4、切片获取的是视图,而非副本
x4 = np.random.randint(20, size=(3,4))
x4
array([[ 5, 14, 7, 2],
[ 8, 12, 9, 3],
[19, 0, 10, 7]])
x5 = x4[:2, :2]
x5
array([[ 5, 14],
[ 8, 12]])
注意:视图元素发生修改,则原数组亦发生相应修改
x5[0, 0] = 0
x5
array([[ 0, 14],
[ 8, 12]])
x4
array([[ 0, 14, 7, 2],
[ 8, 12, 9, 3],
[19, 0, 10, 7]])
修改切片的安全方式:copy
x4 = np.random.randint(20, size=(3,4))
x4
array([[18, 14, 10, 12],
[10, 16, 7, 19],
[ 3, 16, 3, 12]])
x6 = x4[:2, :2].copy()
x6
array([[18, 14],
[10, 16]])
x6[0, 0] = 0
x6
array([[ 0, 14],
[10, 16]])
x4
array([[18, 14, 10, 12],
[10, 16, 7, 19],
[ 3, 16, 3, 12]])
10.3.4 数组的变形
x5 = np.random.randint(0, 10, (12,))
x5
array([5, 0, 1, 3, 2, 6, 3, 8, 7, 5, 2, 5])
x5.shape
(12,)
x6 = x5.reshape(3, 4)
x6
array([[9, 8, 5, 9],
[2, 6, 2, 9],
[4, 5, 1, 7]])
注意:reshape返回的是视图,而非副本
x6[0, 0] = 0
x5
array([0, 8, 5, 9, 2, 6, 2, 9, 4, 5, 1, 7])
一维向量转行向量
x7 = x5.reshape(1, x5.shape[0])
x7
array([[0, 8, 5, 9, 2, 6, 2, 9, 4, 5, 1, 7]])
x8 = x5[np.newaxis, :]
x8
array([[0, 8, 5, 9, 2, 6, 2, 9, 4, 5, 1, 7]])
一维向量转列向量
x7 = x5.reshape(x5.shape[0], 1)
x7
array([[0],
[8],
[5],
[9],
[2],
[6],
[2],
[9],
[4],
[5],
[1],
[7]])
x8 = x5[:, np.newaxis]
x8
array([[0],
[8],
[5],
[9],
[2],
[6],
[2],
[9],
[4],
[5],
[1],
[7]])
多维向量转一维向量
x6 = np.random.randint(0, 10, (3, 4))
x6
array([[3, 7, 6, 4],
[4, 5, 6, 3],
[7, 6, 2, 3]])
flatten返回的是副本
x9 = x6.flatten()
x9
array([3, 7, 6, 4, 4, 5, 6, 3, 7, 6, 2, 3])
x9[0]=0
x6
array([[3, 7, 6, 4],
[4, 5, 6, 3],
[7, 6, 2, 3]])
ravel返回的是视图
x10 = x6.ravel()
x10
array([3, 7, 6, 4, 4, 5, 6, 3, 7, 6, 2, 3])
x10[0]=0
x6
array([[0, 7, 6, 4],
[4, 5, 6, 3],
[7, 6, 2, 3]])
reshape返回的是视图
x11 = x6.reshape(-1)
x11
array([0, 7, 6, 4, 4, 5, 6, 3, 7, 6, 2, 3])
x11[0]=10
x6
array([[10, 7, 6, 4],
[ 4, 5, 6, 3],
[ 7, 6, 2, 3]])
10.3.5 数组的拼接
x1 = np.array([[1, 2, 3],
[4, 5, 6]])
x2 = np.array([[7, 8, 9],
[0, 1, 2]])
1、水平拼接——非视图
- hstack()
- c_
x3 = np.hstack([x1, x2])
x3
array([[1, 2, 3, 7, 8, 9],
[4, 5, 6, 0, 1, 2]])
x3[0][0] = 0
x1
array([[1, 2, 3],
[4, 5, 6]])
x4 = np.c_[x1, x2]
x4
array([[1, 2, 3, 7, 8, 9],
[4, 5, 6, 0, 1, 2]])
x4[0][0] = 0
x1
array([[1, 2, 3],
[4, 5, 6]])
2、垂直拼接——非视图
- vstack()
- r_
x1 = np.array([[1, 2, 3],
[4, 5, 6]])
x2 = np.array([[7, 8, 9],
[0, 1, 2]])
x5 = np.vstack([x1, x2])
x5
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[0, 1, 2]])
x6 = np.r_[x1, x2]
x6
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[0, 1, 2]])
10.3.6 数组的分裂
1、split的用法
x6 = np.arange(10)
x6
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x1, x2, x3 = np.split(x6, [2, 7]) #分裂点的位置,前向(从0开始)
print(x1, x2, x3)
[0 1] [2 3 4 5 6] [7 8 9]
2、hsplit的用法
x7 = np.arange(1, 26).reshape(5, 5)
x7
array([[ 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]])
left, middle, right = np.hsplit(x7, [2,4])
print("left:\n", left) # 第0~1列
print("middle:\n", middle) # 第2~3列
print("right:\n", right) # 第4列
left:
[[ 1 2]
[ 6 7]
[11 12]
[16 17]
[21 22]]
middle:
[[ 3 4]
[ 8 9]
[13 14]
[18 19]
[23 24]]
right:
[[ 5]
[10]
[15]
[20]
[25]]
3、vsplit的用法
x7 = np.arange(1, 26).reshape(5, 5)
x7
array([[ 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]])
upper, middle, lower = np.vsplit(x7, [2,4])
print("upper:\n", upper) # 第0~1行
print("middle:\n", middle) # 第2~3行
print("lower:\n", lower) # 第4行
upper:
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
middle:
[[11 12 13 14 15]
[16 17 18 19 20]]
lower:
[[21 22 23 24 25]]
10.4 Numpy四大运算
10.4.1 向量化运算
1、与数字的加减乘除等 可见整体进行了向量化的运算
x1 = np.arange(1,6)
x1
array([1, 2, 3, 4, 5])
print("x1+5", x1+5)
print("x1-5", x1-5)
print("x1\*5", x1\*5)
print("x1/5", x1/5)
x1+5 [ 6 7 8 9 10]
x1-5 [-4 -3 -2 -1 0]
x1*5 [ 5 10 15 20 25]
x1/5 [0.2 0.4 0.6 0.8 1. ]
print("-x1", -x1)
print("x1\*\*2", x1\*\*2)
print("x1//2", x1//2)
print("x1%2", x1%2)
-x1 [-1 -2 -3 -4 -5]
x1**2 [ 1 4 9 16 25]
x1//2 [0 1 1 2 2]
x1%2 [1 0 1 0 1]
2、绝对值、三角函数、指数、对数
(1)绝对值
x2 = np.array([1, -1, 2, -2, 0])
x2
array([ 1, -1, 2, -2, 0])
abs(x2)
array([1, 1, 2, 2, 0])
np.abs(x2)
array([1, 1, 2, 2, 0])
(2)三角函数
theta = np.linspace(0, np.pi, 3)
theta
array([0. , 1.57079633, 3.14159265])
print("sin(theta)", np.sin(theta))
print("con(theta)", np.cos(theta))
print("tan(theta)", np.tan(theta))
sin(theta) [0.0000000e+00 1.0000000e+00 1.2246468e-16]
con(theta) [ 1.000000e+00 6.123234e-17 -1.000000e+00]
tan(theta) [ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]
x = [1, 0 ,-1]
print("arcsin(x)", np.arcsin(x))
print("arccon(x)", np.arccos(x))
print("arctan(x)", np.arctan(x))
arcsin(x) [ 1.57079633 0. -1.57079633]
arccon(x) [0. 1.57079633 3.14159265]
arctan(x) [ 0.78539816 0. -0.78539816]
(3)指数运算
x = np.arange(3)
x
array([0, 1, 2])
np.exp(x)
array([1. , 2.71828183, 7.3890561 ])
(4)对数运算
x = np.array([1, 2, 4, 8 ,10])
print("ln(x)", np.log(x))
print("log2(x)", np.log2(x))
print("log10(x)", np.log10(x))
ln(x) [0. 0.69314718 1.38629436 2.07944154 2.30258509]
log2(x) [0. 1. 2. 3. 3.32192809]
log10(x) [0. 0.30103 0.60205999 0.90308999 1. ]
3、两个数组的运算
x1 = np.arange(1,6)
x1
array([1, 2, 3, 4, 5])
x2 = np.arange(6,11)
x2
array([ 6, 7, 8, 9, 10])
print("x1+x2:", x1+x2)
print("x1-x2:", x1-x2)
print("x1\*x2:", x1\*x2)
print("x1/x2:", x1/x2)
x1+x2: [ 7 9 11 13 15]
x1-x2: [-5 -5 -5 -5 -5]
x1*x2: [ 6 14 24 36 50]
x1/x2: [0.16666667 0.28571429 0.375 0.44444444 0.5 ]
10.4.2 矩阵运算
x = np.arange(9).reshape(3, 3)
x
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
- 矩阵的转置
y = x.T
y
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
- 矩阵乘法
x = np.array([[1, 0],
[1, 1]])
y = np.array([[0, 1],
[1, 1]])
x.dot(y)
array([[0, 1],
[1, 2]])
np.dot(x, y)
array([[0, 1],
[1, 2]])
y.dot(x)
array([[1, 1],
[2, 1]])
np.dot(y, x)
array([[1, 1],
[2, 1]])
注意跟x*y的区别,x*y只是对应位置相乘
x\*y
array([[0, 0],
[1, 1]])
10.4.3 广播运算
x = np.arange(3).reshape(1, 3)
x
array([[0, 1, 2]])
x+5
array([[5, 6, 7]])
规则
如果两个数组的形状在维度上不匹配
那么数组的形式会沿着维度为1的维度进行扩展以匹配另一个数组的形状。
x1 = np.ones((3,3))
x1
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
x2 = np.arange(3).reshape(1, 3)
x2
array([[0, 1, 2]])
x1+x2
array([[1., 2., 3.],
[1., 2., 3.],
[1., 2., 3.]])
x3 = np.logspace(1, 10, 10, base=2).reshape(2, 5)
x3
array([[ 2., 4., 8., 16., 32.],
[ 64., 128., 256., 512., 1024.]])
x4 = np.array([[1, 2, 4, 8, 16]])
x4
array([[ 1, 2, 4, 8, 16]])
x3/x4
array([[ 2., 2., 2., 2., 2.],
[64., 64., 64., 64., 64.]])
x5 = np.arange(3).reshape(3, 1)
x5
array([[0],
[1],
[2]])
x6 = np.arange(3).reshape(1, 3)
x6
array([[0, 1, 2]])
x5+x6
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
10.4.3 广播运算
x = np.arange(3).reshape(1, 3)
x
array([[0, 1, 2]])
x+5
array([[5, 6, 7]])
规则
如果两个数组的形状在维度上不匹配
那么数组的形式会沿着维度为1的维度进行扩展以匹配另一个数组的形状。
x1 = np.ones((3,3))
x1
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
x2 = np.arange(3).reshape(1, 3)
x2
array([[0, 1, 2]])
x1+x2
array([[1., 2., 3.],
[1., 2., 3.],
[1., 2., 3.]])
x3 = np.logspace(1, 10, 10, base=2).reshape(2, 5)
x3
array([[ 2., 4., 8., 16., 32.],
[ 64., 128., 256., 512., 1024.]])
x4 = np.array([[1, 2, 4, 8, 16]])
x4
array([[ 1, 2, 4, 8, 16]])
x3/x4
array([[ 2., 2., 2., 2., 2.],
[64., 64., 64., 64., 64.]])
x5 = np.arange(3).reshape(3, 1)
x5
array([[0],
[1],
[2]])
x6 = np.arange(3).reshape(1, 3)
x6
array([[0, 1, 2]])
x5+x6
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
[外链图片转存中…(img-U7glh3we-1715573340151)]
[外链图片转存中…(img-h5wnIyaK-1715573340152)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!