前期准备
使用numpy需要您先
pip install numpy
如果下载速度太慢,请看我另一篇博客: pip镜像管理和npm镜像管理
然后每次使用numpy都需要import 一下,以下默认都有
import numpy as np
1. 构造numpy数组
例子1: np.array
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
运行结果:
例子2: np.arange
a = np.arange(15).reshape(3,5)
print(a)
运行结果:
例子3:np.arange
#起点,终点,步长
a = np.arange(10, 50, 5)
print(a)
运行结果:
tips: numpy转成列表只需要list(a) 即可返回转换后的列表。
例子4: 创建特殊数组
- np.zeros(), 如果是参数是一个数字,那么就是生成一维度的全0数组,如果是多维的全0数组,则参数是元组。如np.zeros(3) 和 np.zeros((2, 5))
- np.ones(), 同上,区别就是这个是全1数组
- np.eye(), 单位矩阵,传入的参数是一个数字,如np.eye(5), 生成5 × 5的单位矩阵。
- np.zeros_like() , 参数是一个numpy数组,生成的数组维度和传入参数的数组维度一样
- np.ones_like(), 参数是一个numpy数组,生成的数组维度和传入参数的数组维度一样
- np.diag(), 对角矩阵,参数是一个列表,传入的列表的元素是生成的对角矩阵的元素。
- np.hamming(), 海明数组。
a = np.diag([6, 8, 10])
print(a)
运行结果:
例子5:np.random.randint()
np.random.randint(0,50,5)
可见生成的是5个0到50之间的元素组成的numpy数组。(左闭右开)
2. 查看数组属性
- a.shape 查看形状
- a.ndim 查看维度
- a.itemsize 查看每个元素在内存中所占据的字节数
- a.size 查看有多少个元素
看下面的例子:
import numpy as np
a = np.arange(15).reshape(3, 5)
print(a)
print("a.shape: ", a.shape)
print("a.ndim: ", a.ndim)
print("a.itemsize", a.itemsize)
print("a.size: ", a.size)
运行结果:
3. numpy向量运算
他们都是对numpy数组中的元素逐个操作的,我们看个例子就明白了。
逐个元素运算
我们先给两个数组:
a = np.array([20,30,40,50])
b = np.arange(1, 5)
然后看看四则运算:
print('a + b: ', a + b)
print('a - b: ', a - b)
print('a * b: ', a * b)
print('a / b: ', a / b)
print('a // b: ', a // b)
再看看平方:
print('b ** 2: ', b ** 2)
向量运算
先给两个数组:
A = np.array([[1,1],
[0,1]])
B = np.array( [[2,0],
[3,4]] )
我们知道对应元素相乘是 A * B, 但是矩阵乘法是 A @ B, 或者 A.dot(B) , np.dot(A, B)
看下面的完整例子:
import numpy as np
A = np.array([[1, 1],
[0, 1]])
B = np.array([[2, 0],
[3, 4]])
print("A:\n", A)
print("B:\n", B)
print('A @ B:\n', A @ B)
print('A.dot(B):\n', A.dot(B))
print('np.dot(A, B):\n', np.dot(A, B))
4. numpy常用一维数学函数
以下函数参数都为np数组
- 三角函数:np.sin()、np.cos()、np.tan()
- 常见数学运算: np.exp(), np.log(), np.log10()
- np.around() 函数返回指定数字的四舍五入值。
- np.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。
- np.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。
- np.abs() 返回的数组的元素类型为整数
- np.fabs() 返回的数组的元素类型为浮点数
5. numpy常用统计方法:
先给个数组
a = np.random.random((4, 5))
由于该函数随机生成数组,故每一次都会不一样(超级小的概率会一样)。
b.sum() # 求和
b.max() # 求最大值
b.min() # 求最小值
np.mean(b) # 求均值
np.std(b) # 求方差
np.var(b) # 求标准差
然后如果是想要对下标操作的话,可用 argmax, argmin, argsort 返回相应的下标。并可用axis参数, 如 np.argmax(a, axis=0) #axis=0代表往跨行(down),而axis=1代表跨列(across),设axis=i,则沿着第i个下标变化的方向进行操作!
5. numpy线性代数
例子1: 求解方阵的特征值和特征向量.
[ 1 5 9 3 2 8 5 7 4 ] (1) \begin{bmatrix} 1 & 5 & 9 \\ 3 & 2 & 8 \\ 5 & 7 & 4 \end{bmatrix} \tag{1} ⎣⎡135527984⎦⎤(1)
求解代码如下:
import numpy as np
array = np.array([[1, 5, 9], [3, 2, 8], [5, 7, 4]])
r1, r2 = np.linalg.eig(array)
# 特征值
print(r1)
# 特征向量
print(r2)
运行结果:
例子2: 求解矩阵行列式
"""
numpy 计算行列式子
"""
import numpy as np
# a = [[1, 5, 9],
# [3, 2, 8],
# [5, 7, 4]]
a = [[1, 5],
[2, 4]]
a = np.array(a)
# 行列式
det = np.linalg.det(a)
print(det)
程序输出结果:
补充一下二维和三维的行列式值。
例子3: 求解线性方程组
{ x + y = 10 2000 x + 1500 y = 18000 \left\{ \begin{array}{l} x+y=10 \\ 2000x+1500y=18000 \end{array} \right. { x+y=102000x+1500y=18000
求解代码入下:
import numpy as np
A = np.array([[1, 1], [2000, 1500]])
B = np.array([10, 18000])
result = np.linalg.solve(A, B)
print(result)
运行结果:
就是方程组的解为
{ x = 6 y = 4 \left\{ \begin{array}{l} x=6 \\ y=4 \end{array} \right. {
x=6y=4
例子4: 求向量的长度
比如求向量 [3,4]的长度
import numpy as np
np.linalg.norm([3, 4])
输出结果就是 5.0.
例子5: 奇异值分解
对下列矩阵进行奇异值分解
[ 5 6 9 3 8 4 ] (2) \begin{bmatrix} 5 & 6 & 9 \\ 3 & 8 & 4 \\ \end{bmatrix} \tag{2} [536894](2)
代码如下:
import numpy as np
A = np.array([[5, 6, 9], [3, 8, 4]])
p, sigma, q = np.linalg.svd(A)
print(p)
print(sigma)
print(q)
运行结果:
这里呢, A等于三个矩阵的内积
A = p ⋅ s i g m a ⋅ q A = p \cdot sigma \cdot q A=p⋅sigma⋅q
加入A是一个 m × n 的矩阵,那么p, sigma, q的维度分别是
m × m, m × n, n × n 。
且
p p T = I p \mathbf{p}^\mathsf{T} = I ppT=I
q q T = I q \mathbf{q}^\mathsf{T} = I qqT=I
例子6: 角度和弧度转换
import numpy as np
# 结果90
np.rad2deg(np.pi/2)
# 结果1.5707963267948966
np.deg2rad(90)