第三章:NumPy (4)
NumPy(4) 简介
矩阵库
NumPy
中包含了一个矩阵库numpy.matlib
,该模块中的函数返回的是一个矩阵,而不是ndarray
对象
matlib.empty()
- matlib.empty() 函数返回一个新的矩阵
numpy.matlib.empty(shape, dtype, order)
参数 | 描述 |
---|---|
shape | 定义新矩阵形状的整数或整数元组 |
Dtype | 可选,数据类型 |
order | C(行序优先) 或者 F(列序优先) |
import numpy.matlib
import numpy as np
print(np.matlib.empty((2, 2)))
# 填充为随机数据
运行结果
[[1.21696545e-152 1.02188498e-152] [1.99550808e+161 4.83245960e+276]]
numpy.matlib.zeros()
- numpy.matlib.zeros() 函数创建一个以 0 填充的矩阵
import numpy.matlib
import numpy as np
print(np.matlib.zeros((2, 2)))
运行结果
[[0. 0.] [0. 0.]]
numpy.matlib.ones()
- numpy.matlib.ones() 函数创建一个以 1 填充的矩阵
import numpy.matlib
import numpy as np
print(np.matlib.ones((2, 2)))
运行结果
[[1. 1.] [1. 1.]]
numpy.matlib.eye()
- numpy.matlib.eye() 函数返回一个矩阵,对角线元素为 1,其他位置为零
numpy.matlib.eye(n, M,k, dtype)
参数 | 描述 |
---|---|
n | 返回矩阵的行数 |
M | 返回矩阵的列数,默认为 n |
k | 对角线的索引 |
dtype | 数据类型 |
import numpy.matlib
import numpy as np
print (np.matlib.eye(n = 3, M = 4, k = 0, dtype = float))
运行结果
[[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.]]
numpy.matlib.identity()
- numpy.matlib.identity() 函数返回给定大小的单位矩阵
- 单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1,除此以外全都为 0
import numpy.matlib
import numpy as np
# 大小为 5,类型位浮点型
print(np.matlib.identity(5, dtype=float))
运行结果
[[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]]
numpy.matlib.rand()
- numpy.matlib.rand() 函数创建一个给定大小的矩阵,数据是随机填充的
import numpy.matlib
import numpy as np
print(np.matlib.rand(3, 3))
运行结果
[[0.32150496 0.36550133 0.62103423] [0.52475631 0.25503639 0.10987947] [0.35445619 0.76107111 0.50588554]]
注意
矩阵总是二维的,而 ndarray 是一个 n 维数组。 两个对象都是可互换的
线性代数模块
概览
函数 | 描述 |
---|---|
dot | 两个数组的点积,即元素对应相乘。 |
vdot | 两个向量的点积 |
inner | 两个数组的内积 |
matmul | 两个数组的矩阵积 |
determinant | 数组的行列式 |
solve | 求解线性矩阵方程 |
inv | 计算矩阵的乘法逆矩阵 |
numpy.dot()
- 该函数返回两个数组的点积。
- 对于二维向量,其等效于矩阵乘法
- 对于一维数组,它是向量的内积
- 对于N维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积
import numpy.matlib
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[11, 12], [13, 14]])
print(np.dot(a, b))
运行结果
[[37 40] [85 92]]
计算式为:
[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]
numpy.vdot()
- 该函数返回两个向量的点积。如果第一个参数是复数, 那么它的共轭复数会用于计算
- 如果参数id是多维数组,它就会被展开
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[11, 12], [13, 14]])
# vdot 将数组展开计算内积
print(np.vdot(a, b))
运行结果
130
计算式为:
1*11 + 2*12 + 3*13 + 4*14 = 130
numpy.inner()
- numpy.inner() 函数返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积
import numpy as np
print(np.inner(np.array([1, 2, 3]), np.array([0, 1, 0])))
# 等价于 1*0+2*1+3*0
运行结果
2
numpy.matmul
- numpy.matmul 函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播
import numpy.matlib
import numpy as np
a = [[1, 0], [0, 1]]
b = [[4, 1], [2, 2]]
print(np.matmul(a, b))
运行结果
[[4 1] [2 2]]
numpy.linalg.det()
- numpy.linalg.det() 函数计算输入矩阵的行列式
- 对于矩阵[[a,b],[c,d]],行列式计算为 ad-bc。 较大的方阵被认为是 2×2 矩阵的组合
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(np.linalg.det(a))
运行结果
-2.0000000000000004
numpy.linalg.solve()
- numpy.linalg.solve() 函数给出了矩阵形式的线性方程的解
numpy.linalg.inv()
- numpy.linalg.inv() 函数计算矩阵的乘法逆矩阵
import numpy as np
x = np.array([[1, 2], [3, 4]])
y = np.linalg.inv(x)
print(x)
print(y)
print(np.dot(x, y))
运行结果
[[1 2] [3 4]] [[-2. 1. ] [ 1.5 -0.5]] [[1.0000000e+00 0.0000000e+00] [8.8817842e-16 1.0000000e+00]]
Matplotlib 库
安装 Matplotlib 库
pip install matplotlib
使用以下脚本绘制方程y=2x+ 5。
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1, 11)
y = 2 * x + 5
plt.title(" Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x, y)
plt.show()
运行结果
Matplotlib 绘制直方图
numpy.histogram()
- numpy.histogram() 函数是数据的频率分布的图形表示。 水平尺寸相等的矩形对应于类间隔,称为 bin,变量 height 对应于频率
- numpy.histogram()函数将输入数组和 bin 作为两个参数。 bin 数组中的连续元素用作每个 bin 的边界
import numpy as np
a = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])
np.histogram(a, bins=[0, 20, 40, 60, 80, 100])
hist, bins = np.histogram(a, bins=[0, 20, 40, 60, 80, 100])
print(hist)
print(bins)
运行结果
[3 4 5 2 1] [ 0 20 40 60 80 100]
plt()
- Matplotlib 可以将直方图的数字表示转换为图形
- pyplot 子模块的 plt() 函数将包含数据和 bin 数组的数组作为参数,并转换为直方图
from matplotlib import pyplot as plt
import numpy as np
a = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])
plt.hist(a, bins=[0, 20, 40, 60, 80, 100])
plt.title("histogram")
plt.show()
运行结果
IO 文件操作
NumPy
为 ndarray
对象引入了一个简单的文件格式:.npy
npy
文件用于存储重建 ndarray
所需的数据、图形、dtype
和其他信息
常用 IO函数:
load()
和save()
函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy
的文件中loadtxt()
和savetxt()
函数处理正常的文本文件(.txt
等)
numpy.save()
numpy.save()
函数将数组保存到以.npy
为扩展名的文件中
import numpy as np
a = np.array([1, 2, 3, 4, 5])
# 保存到 outfile.npy 文件上
np.save("outfile.npy", a)
b = np.load("outfile.npy")
print(b)
运行结果
[1 2 3 4 5]
同时根目录产生一个名为 outfile.npy
的文件
savetxt()
- savetxt() 函数是以简单的文本文件格式存储数据,对应的使用 loadtxt() 函数来获取数据
import numpy as np
a = np.array([1, 2, 3, 4, 5])
np.savetxt("out.txt", a)
b = np.loadtxt("out.txt")
print(b)
运行结果
[1. 2. 3. 4. 5.]
同时根目录产生一个名为 out.txt
的文件
NumPy 实例:GPS 定位
略。