(一)、NumPy
(1)、介绍与安装
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算
直接安装: pip install numpy,我这里的版本是1.19.1。
Installing collected packages: numpy
Successfully installed numpy-1.19.1
(2)、基础使用
引入NumPy:
import numpy as np
创建数组:
# 1维数组
a = np.array([1, 2, 3, 4])
print("1维数组:", a)
# 2维数组
b = np.array([[1, 2], [3, 4]])
print("2维数组:", b)
# 指定数组维度,ndmin = 3是3维数组。
c = np.array([[1, 2], [3, 4]], ndmin=3)
print("指定数组维度:", c)
# 指定数组数值类型,complex复数类型。
d = np.array([[1, 2], [3, 4]], dtype=complex)
print("指定数组数值类型", d)
输出结果:
1维数组: [1 2 3 4]
2维数组: [[1 2] [3 4]]
指定数组维度: [[[1 2] [3 4]]]
指定数组数值类型 [[1.+0.j 2.+0.j] [3.+0.j 4.+0.j]]
(3)、向量的运算
我们不能发现,数组其实可以看做向量,我们可以利用数组来进行向量的运算。我们这里重点不在数学上,如果数学知识不足,还请自行查阅资源。
向量是将几何问题转化为代数问题的桥梁,向量的加减则是用代数方法进行几何运算。
坐标系解向量加减法 :
在直角坐标系里面,定义原点为向量的起点。两个向量和与差的坐标分别等于这两个向量相应坐标的和与差若向量的表示为(x,y)形式:
A(X1,Y1) B(X2,Y2),则A + B=(X1+X2,Y1+Y2),A - B=(X1-X2,Y1-Y2)
简单地讲:向量的加减就是向量对应分量的加减,类似于物理的正交分解。
三角形定则解决向量加法的方法:将各个向量依次首尾顺次相接,结果为第一个向量的起点指向最后一个向量的终点。
数乘向量(scalar multiplication of vectors)
数乘是与一个实数和一个向量有关的一种向量运算,即数量与向量的乘法运算。
A(X1,Y1) B(X2,Y2),则A x B =(X1X2,Y1Y2)
import numpy as np
# 构建向量
a = np.array([-1, 2])
b = np.array([3, 1])
# 加法 a_b = a + b
# 数乘
a2 = a * 2
b3 = b * 3
axb = a * b
print(a_b, a2, b3, axb)
结果:[2 3] [-2 4] [9 3] [-3 2]
点积:
点积有两种定义方式:代数方式和几何方式。通过在欧氏空间中引入笛卡尔坐标系,向量之间的点积既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。
广义定义
在一个向量空间V中,定义在VxV上的正定对称双线性形式函数即是V的数量积,而添加有一个数量积的向量空间即是内积空间。
代数定义
设二维空间内有两个向量a和b,定义它们的数量积(又叫内积、点积)为以下实数:
几何定义
设二维空间内有两个向量a和b,|a|和|b|表示向量a和b的大小,它们的夹角为,则内积定义为以下实数:
这里出现了向量的模的计算:
空间向量(x,y,z),其中x,y,z分别是三轴上的坐标,模长是:
平面向量(x,y),模长是:
对于向量X属于n维复向量空间:
import numpy as np
# 构建向量
a = np.array([-2, 2])
b = np.array([2, 2])
# 计算点积
ab_1 = np.inner(a, b)
# 根据夹角来计算点积,向量的夹角为45度。
ab_2 = np.linalg.norm(a) * np.linalg.norm(b) * np.cos(np.pi / 2)
print(ab_1,ab_2)
输出结果:0 4.898587196589414e-16
这两种方法计算结果不同,是由于np.pi/2是π/2的近似值,所以结果也是个超级接近于零的结果。其中np.linalg.norm(求范数)是用来求解范数的,这个暂时理解为求解向量的模数。
上述程序我们利用了:两个向量的点积的几何意义是他们的模乘以他们夹角的余弦。
我们也就得出了余弦定理:
也是 |C|2 = |a|2+|b|2 - 2|a||b|cos θ
我们可以求得两个向量的夹角:
import numpy as np
# 构建向量
a = np.array([-2, 2])
b = np.array([2, 2])
c2 = np.inner(a, b)
# 得到COS的数值
cos_num = c2 / (np.linalg.norm(a) * np.linalg.norm(b))
# 得到弧度
angle_cos_radian = np.arccos(cos_num)
# 弧度转换成角度
angle_cos = angle_cos_radian / np.pi * 180
print("夹角:", angle_cos)
输出结果:夹角: 90.0
(4)、定义数组的其他方式和常用函数
a = np.arange(5)
Out:[0 1 2 3 4]
b = np.arange(1, 30, 2)
Out:[ 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29]
print(b[2:5])
Out:[5 7 9]
b[2:5] = 0
print(b)
Out:[ 1 3 0 0 0 11 13 15 17 19 21 23 25 27 29]
# 重塑数组b,变成3行5列的二维数组
c = np.reshape(b, (3, 5))
print(c)
Out:
[[ 1 3 0 0 0]
[11 13 15 17 19]
[21 23 25 27 29]]
print(c[[1, 2]])
Out:
[[11 13 15 17 19]
[21 23 25 27 29]]
**开方的处理:**
d = np.array([1, 4, 9, 16])
e = np.sqrt(d)
print(e)
Out:[1. 2. 3. 4.]
**均匀生成数组:**
f = np.linspace(0, 20, 6)
print(f)
Out:[ 0. 4. 8. 12. 16. 20.]