《python科学计算入门》学习笔记
# Numpy
# 导入
import numpy as np
1
# 创建数组
import numpy as np
x = np.array([1,2,3,4])
print(type(x))
print(x.ndim)
print(x.shape)
print(x)
1
2
3
4
5
6
2
3
4
5
6
<class 'numpy.ndarray'>
1
(4,)
[1 2 3 4]
1
2
3
4
2
3
4
type(x)
返回的是x
的类型x.ndim
是 x 的维度x.shape
返回的是 x 各个维度的长度,由于这个只有一个维度所以只返回一个结果
# 二维数组的创建
y = np.array([[1],[2],[3]])
print(y)
print(y.shape)
1
2
3
2
3
[[1]
[2]
[3]]
(3, 1)
1
2
3
4
2
3
4
# 值为 0 和 1 的数组
np.ones((2,3))
1
array([[1., 1., 1.],
[1., 1., 1.]])
1
2
2
如果元素为 1 的数组乘某一个数值,就可以创建填满该数值的数组
np.full((2,3),-1)
1
array([[-1, -1, -1],
[-1, -1, -1]])
1
2
2
x = np.empty((2,3))
x
1
2
2
array([[1., 1., 1.],
[1., 1., 1.]])
1
2
2
注意 empty 函数只用于开创这么多空间,但是没有初始化数组里面的值,所以速度较快
# 单位矩阵、对角矩阵、三角矩阵
np.identity(3)
1
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
1
2
3
2
3
np.diag([1,2,4],k = -1)
1
array([[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 4, 0]])
1
2
3
4
2
3
4
- k 指定对角元素排列的位置
np.tri(3)
1
array([[1., 0., 0.],
[1., 1., 0.],
[1., 1., 1.]])
1
2
3
2
3
x = np.array([[2,-1],
[3,4]])
np.tril(x)
1
2
3
2
3
array([[2, 0],
[3, 4]])
1
2
2
tril
可以在原有矩阵的基础上保留下三角,triu
是保留上三角
# 数组值等间距变化的数组
np.arange(1,10,2)
1
array([1, 3, 5, 7, 9])
1
np.linspace(0,1,5,endpoint=False)
1
array([0. , 0.2, 0.4, 0.6, 0.8])
1
np.linspace(0,1,5)
1
array([0. , 0.25, 0.5 , 0.75, 1. ])
1
linspace 的参数是 (start, stop, num) 的形式给出的,num 可以确定区间内参数的数量,如果设定 endpoint=False
那么数组中不会包含 stop 的值
# 数组的访问
# 索引和切片
x = np.arange(10)
x[:4]
1
2
2
array([0, 1, 2, 3])
1
x = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(x[1,2])
print(x[:,2])
1
2
3
4
5
2
3
4
5
6
[3 6 9]
1
2
2
# 视图和副本
x = np.array([1,2,3,4,5])
y = x[:3]
y[:] = 0
print(y)
print(x)
1
2
3
4
5
6
2
3
4
5
6
[0 0 0]
[0 0 0 4 5]
1
2
2
在这里,我们修改了 y 之后发现 x 也被改变了,这种和原有数组共享内存的数组被称为视图,所以需要使用 copy 来创建副本
x = np.array([1,2,3,4,5])
y = x[:2].copy()
y[:] = 0
print(y)
print(x)
1
2
3
4
5
6
7
2
3
4
5
6
7
[0 0]
[1 2 3 4 5]
1
2
2
这样子 x 的值就没有被修改了
# 数组的基本运算
x = np.array([[1,-1],
[3,2]])
y = np.array([[0, 1],
[-2,1]])
x+y
1
2
3
4
5
6
2
3
4
5
6
array([[1, 0],
[1, 3]])
1
2
2
当 x 和 y 的维度及大小都相同时,直接相加
如果维度不同时,需要把小的维度拓展到和大的维度相同后再进行运算,就是对原数组进行复制,这种处理被叫做广播
x = np.array([[1,2],
[3,4]])
y = np.array([[5,6]])
x+y
1
2
3
4
2
3
4
array([[ 6, 8],
[ 8, 10]])
1
2
2
这里可以理解为
# 通用函数
x = np.arange(5)
np.sqrt(x)
1
2
2
array([0. , 1. , 1.41421356, 1.73205081, 2. ])
1
对数组进行运算可以理解成对数组中的每个数单独进行运算
x = np.array([1,2,3,4])
y = np.array([4,3,2,1])
x > y
1
2
3
2
3
array([False, False, True, True])
1
# 矩阵运算
A = np.array([[1, -2],
[2, 0]])
B = np.array([[3, 4],
[-1, -3]])
C = A @ B
C
1
2
3
4
5
6
7
2
3
4
5
6
7
array([[ 5, 10],
[ 6, 8]])
1
2
2
# Matplotlib
# 导入
import matplotlib.pyplot as plt
1
# 基础图标
# 简单二维图表
图表对象是 Figure,而 Axes 对象包含在 Figure 里面,表示某一个图表的绘制区域
使用 add_axes
方法可以在 Figure 中添加新的 Axes,然后使用元组对 Axes 对位置和大小进行指定
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
fig = plt.figure()
# 坐标(0.15, 0.1),宽70%,高80%
ax = fig.add_axes((0.15, 0.1, 0.7, 0.8))
ax.plot(x, y)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12