【NumPy】常用姿势积累

网友投稿 599 2022-05-30

文章目录

1.矩阵运算

2.arange()生成ndarray数组

3.meshgrid

4.通过array转为二维数组

5.利用 ix_()函数进行数组切片

6.数组连接

7.数据的存取

8.求逆、解方程、特征值

9.奇异值分解、计算行列式

10.argsort函数

Reference

如何导入并使用Numpy创建数组以及相关的数组运算、获得数组的尺寸、数组的四则运算与数学函数运算、数组的切片、数组连接和数据的存取、数组形态变换、数组元素的排序与搜索、矩阵及线性代数运算等相关知识。

由于Numpy借鉴了Matlab矩阵开发思路,故Numpy的数组创建、运算、切片、连接及存取、排序与搜索、矩阵及线性代数运算均与Matlab的矩阵操作极为相似。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

一个强大的N维数组对象 ndarray

广播功能函数

整合 C/C++/Fortran 代码的工具

线性代数、傅里叶变换、随机数生成等功能

Numpy中,矩阵有两种表示方式:

matrix类时,比如2 x 3矩阵A不能和A自身相乘

array类时,上面的A则可以相乘,默认的乘法是Hadamard乘法(即矩阵之间的逐点乘积,对应的矩阵元素相乘)。

1.矩阵运算

(1)dot是点积,a.dot(b) 与 np.dot(a,b)效果相同。如果是直接A*B则是两个矩阵对应位置的元素分别进行相乘得到新的矩阵。

矩阵积计算不遵循交换律,np.dot(a,b) 和 np.dot(b,a) 得到的结果是不一样的

(2)transpose是矩阵转置

(3)inv是求矩阵的逆

import numpy as np from numpy.linalg import inv A = np.matrix([[1, 2], [3, 4], [5, 6]]) print(A) print("=================") B = np.matrix(range(1, 7)).reshape(3, 2) print(B) print("=================") # 创建特殊矩阵 ans1 = np.zeros((3, 2)) print(ans1) print("=================") ans2 = np.identity(3) print(ans2) print("=================") # 矩阵中向量的提取 m = np.array(range(1, 10)).reshape(3, 3) print(m) print("=================") # 提取行向量 ans3 = m[[0, 2]] # m[[True, False, True]] print(ans3) print("=================") # 提取列向量 ans4 = m[:, [1, 2]] # 或者m[:, [False, True, True]] print(ans4) print("=================") # 矩阵的运算 n = np.array(range(1, 5)).reshape(2, 2) print(n) print("=================") np.transpose(n) print(n) print("=================") add = n + n print(add) print("=================") plus = n - n print(plus) print("=================") # 矩阵的逆矩阵 #ni = inv(n) #print(ni) # 矩阵的逆和原矩阵相乘得到单位矩阵 danwei = np.dot(inv(n), n) print(danwei)

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

57

58

2.arange()生成ndarray数组

Numpy 中 arange() 主要是用于生成数组,具体用法如下

numpy.arange(start, stop, step, dtype = None)

在给定间隔内返回均匀间隔的值。

值在半开区间 [开始,停止]内生成(换句话说,包括开始但不包括停止的区间),返回的是 ndarray 。

from numpy import * # 引入numpy A = arange(5) # 只有结束项 print(A) # 结果 [0 1 2 3 4] 结果不包含结束项 print(type(A)) # 结果 A = arange(1, 5) # 起点为1,步长默认为1 print(A) # 结果 [1 2 3 4] A = arange(1, 5, 2) # 步长默认为2 print(A) # 结果 [1 3] A = arange(1, 5.2, 0.6) # 浮点数参数,结果就不一定完全符合了 print(A) # 结果 [1. 1.6 2.2 2.8 3.4 4. 4.6 5.2]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

3.meshgrid

meshgrid适合画3D图,而mgrid适合画2D图。

适用于生成网格型数据,可以接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对。

那么生成的第一个二维数组是以xarray为行,共ydimesion行的向量;

而第二个二维数组是以yarray的转置为列,共xdimesion列的向量。

import numpy as np xnums = np.arange(4) #print(xnums)# [0 1 2 3] #print(type(xnums)) # ynums = np.arange(5) data_list = np.meshgrid(xnums, ynums) # meshgrid生成网格型数据,接受2个一维数组生成2个 print(data_list) x, y = data_list print(x.shape) print(y.shape) print(x) print(y)

1

2

3

4

5

6

7

8

9

10

11

12

13

输出结果为:

[array([[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]), array([[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]])] (5, 4) (5, 4) [[0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3]] [[0 0 0 0] [1 1 1 1] [2 2 2 2] [3 3 3 3] [4 4 4 4]]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

4.通过array转为二维数组

L=[[1,2],[3,4]] #定义待转化的嵌套列表L print(L) import numpy #导入Numpy包 A=numpy.array(L) #调用Numpy包中提供的函数array(),将L转化为二维数组并赋给A # 即将数据转为数组的形式 print(A) # [[1, 2], [3, 4]] # [[1 2] [3 4]]

1

2

3

4

5

6

7

8

9

也可以用其他的嵌套方式再用array函数:

#1.先预定义列表d1,元组d2,嵌套列表d3、d4和嵌套元组d5 d1=[1,2,3,4,0.1,7] #列表 d2=(1,2,3,4,2.3) #元组 d3=[[1,2,3,4],[5,6,7,8]] #嵌套列表,元素为列表 d4=[(1,2,3,4),(5,6,7,8)] #嵌套列表,元素为元组 d5=((1,2,3,4),(5,6,7,8)) #嵌套元组 #2.导入Numpy,并调用其中的array函数,创建数组 import numpy as np d11=np.array(d1) d21=np.array(d2) d31=np.array(d3) d41=np.array(d4) d51=np.array(d5)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

5.利用 ix_()函数进行数组切片

# 2.5.2 利用 ix_()函数进行数组切片 import numpy as np D=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]) #定义数组D #提取D中行数为1、2,列数为1、3的所有元素 D3=D[np.ix_([1,2],[1,3])] #提取D中行数为0、1,列数为1、3的所有元素 D4=D[np.ix_(np.arange(2),[1,3])] #提取以D中第1列小于11得到的逻辑数组作为行索引,列数为1、2的所有元素 D6=D[np.ix_(D[:,1]<11,[1,2])] #提前以D中第1列小于11得到的逻辑数组作为行索引,列数为2的所有元素 D7=D[np.ix_(D[:,1]<11,[2])] #提前以第2.5.1节中的TF=[True,False,False,True]逻辑列表为行索引,列数为2的所有元素 TF=[True,False,False,True] D8=D[np.ix_(TF,[2])] #提前以第2.5.1节中的TF=[True,False,False,True]逻辑列表为行索引,列数为1、3的所有元素 D9=D[np.ix_(TF,[1,3])]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

6.数组连接

# 2.6 数组连接 import numpy as np A=np.array([[1,2],[3,4]]) #定义二维数组A B=np.array([[5,6],[7,8]]) #定义二维数组B C_s=np.hstack((A,B)) #水平连接要求行数相同 C_v=np.vstack((A,B)) #垂直连接要求列数相同

1

2

3

4

5

6

7.数据的存取

# 2.7 数据存取 import numpy as np A=np.array([[1,2],[3,4]]) #定义二维数组A B=np.array([[5,6],[7,8]]) #定义二维数组B C_s=np.hstack((A,B)) #水平连接 np.save('data',C_s) import numpy as np C_s=np.load('data.npy')

1

2

3

4

5

6

7

8

9

8.求逆、解方程、特征值

# 2.10.1 创建Numpy矩阵 import numpy as np # 用mat则不会为矩阵创建副本 mat1 = np.mat("1 2 3; 4 5 6; 7 8 9") mat2 = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("mat1: \n",mat1) print("mat2: \n",mat2) print("-"*40) import numpy as np arr1 = np.eye(3) arr2 = 3*arr1 mat = np.bmat("arr1 arr2; arr1 arr2") # 分块矩阵,bmat嵌套矩阵 print("arr1 :\n",arr1) print("arr2 :\n",arr2) print("mat: \n",mat) print("-"*40) # 2.10.2 矩阵的属性和基本运算 import numpy as np mat = np.matrix(np.arange(4).reshape(2, 2)) print("mat:\n",mat) mT=mat.T # 返回自身的转置 mH=mat.H # 返回自身的共轭转置 mI=mat.I # 返回自身的逆矩阵 print("-"*40) import numpy as np mat1 = np.mat("1 2 3; 4 5 6; 7 8 9") mat2 = mat1*3 mat3=mat1+mat2 mat4=mat1-mat2 mat5=mat1*mat2 mat6=np.multiply(mat1, mat2) #点乘 print("-"*40) # 2.10.3 线性代数运算 # 1.计算逆矩阵 import numpy as np mat = np.mat('1 1 1; 1 2 3; 1 3 6') inverse = np.linalg.inv(mat) print(inverse) # mat矩阵和inverse矩阵进行点乘 A=np.dot(mat, inverse) print("A和A的逆矩阵点乘的结果:\n",A) print("-"*40) # 2.求解线性方程组 import numpy as np A = np.mat("1,-1,1; 2,1,0; 2,1,-1") b = np.array([4, 3, -1]) x = np.linalg.solve(A, b)#线性方程组Ax=b的解 print("Ax=b的解为:",x) print("-"*40) # 3.求解特征值与特征向量 import numpy as np A = np.matrix([[1, 0, 2], [0, 3, 0], [2, 0, 1]]) # A_value= np.linalg.eigvals(A) # 也可以这样求特征值 A_value, A_vector = np.linalg.eig(A) print("A矩阵的特征值为:",A_value) print("A矩阵的特征向量为:\n",A_vector) print("-"*40)

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

57

58

59

60

61

62

63

64

【NumPy】常用姿势积累

65

66

67

68

结果为:

mat1: [[1 2 3] [4 5 6] [7 8 9]] mat2: [[1 2 3] [4 5 6] [7 8 9]] ---------------------------------------- arr1 : [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] arr2 : [[3. 0. 0.] [0. 3. 0.] [0. 0. 3.]] mat: [[1. 0. 0. 3. 0. 0.] [0. 1. 0. 0. 3. 0.] [0. 0. 1. 0. 0. 3.] [1. 0. 0. 3. 0. 0.] [0. 1. 0. 0. 3. 0.] [0. 0. 1. 0. 0. 3.]] ---------------------------------------- mat: [[0 1] [2 3]] ---------------------------------------- ---------------------------------------- [[ 3. -3. 1.] [-3. 5. -2.] [ 1. -2. 1.]] A和A的逆矩阵点乘的结果: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ---------------------------------------- Ax=b的解为: [1. 1. 4.] ---------------------------------------- A矩阵的特征值为: [ 3. -1. 3.] A矩阵的特征向量为: [[ 0.70710678 -0.70710678 0. ] [ 0. 0. 1. ] [ 0.70710678 0.70710678 0. ]] ----------------------------------------

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

9.奇异值分解、计算行列式

# 4.奇异值分解 import numpy as np A = np.mat("4.0,11.0,14.0; 8.0,7.0,-2.0") U, Sigma, V = np.linalg.svd(A, full_matrices=False) # U和V是正交矩阵 print("U:",U) print("一开始的Sigma:",Sigma) # Sigma是一维的,其元素为进行奇异值分解的矩阵的非奇异值,可用dig生成对角矩阵 Sigma = np.diag(Sigma) print("变为对角矩阵Sigma:\n",Sigma) print("V:",V) print("-"*40) # 5.计算矩阵行列式的值 import numpy as np A = np.mat("3,4; 5,6") A_value=np.linalg.det(A) print("A的行列式为:\n",A_value) print("-"*40)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

结果为:

U: [[ 0.9486833 -0.31622777] [ 0.31622777 0.9486833 ]] 一开始的Sigma: [18.97366596 9.48683298] 变为对角矩阵Sigma: [[18.97366596 0. ] [ 0. 9.48683298]] V: [[ 0.33333333 0.66666667 0.66666667] [ 0.66666667 0.33333333 -0.66666667]] ---------------------------------------- A的行列式为: -2.0000000000000004 ----------------------------------------

1

2

3

4

5

6

7

8

9

10

11

12

10.argsort函数

import numpy as np x = np.array([1, 4, 3, -1, 6, 9]) print(x.argsort()) # [3 0 2 1 4 5]

1

2

3

4

argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。例如:x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5。

Reference

(1)numpy官方文档

(2)【numpy】np.argsort()函数

Numpy 数据结构 机器学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:AD5933阻抗转换器、网络分析仪初步实验
下一篇:【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)
相关文章