《python科学计算入门》学习笔记

Numpy

导入

import numpy as np

创建数组

import numpy as np
x = np.array([1,2,3,4])
print(type(x))
print(x.ndim)
print(x.shape)
print(x)
<class 'numpy.ndarray'>
1
(4,)
[1 2 3 4]

二维数组的创建

y = np.array([[1],[2],[3]])
print(y)
print(y.shape)
[[1]
 [2]
 [3]]
(3, 1)

值为 0 和 1 的数组

np.ones((2,3))
array([[1., 1., 1.],
       [1., 1., 1.]])

如果元素为 1 的数组乘某一个数值,就可以创建填满该数值的数组

np.full((2,3),-1)
array([[-1, -1, -1],
       [-1, -1, -1]])
x = np.empty((2,3))
x
array([[1., 1., 1.],
       [1., 1., 1.]])

注意 empty 函数只用于开创这么多空间,但是没有初始化数组里面的值,所以速度较快

单位矩阵、对角矩阵、三角矩阵

np.identity(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
np.diag([1,2,4],k = -1)
array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 4, 0]])
np.tri(3)
array([[1., 0., 0.],
       [1., 1., 0.],
       [1., 1., 1.]])
x = np.array([[2,-1],
              [3,4]])
np.tril(x)
array([[2, 0],
       [3, 4]])

tril 可以在原有矩阵的基础上保留下三角,triu 是保留上三角

数组值等间距变化的数组

np.arange(1,10,2)
array([1, 3, 5, 7, 9])
np.linspace(0,1,5,endpoint=False)
array([0. , 0.2, 0.4, 0.6, 0.8])
np.linspace(0,1,5)
array([0.  , 0.25, 0.5 , 0.75, 1.  ])

linspace 的参数是 (start, stop, num) 的形式给出的,num 可以确定区间内参数的数量,如果设定 endpoint=False 那么数组中不会包含 stop 的值

数组的访问

索引和切片

x = np.arange(10)
x[:4]
array([0, 1, 2, 3])
x = np.array([[1,2,3],
             [4,5,6],
             [7,8,9]])
print(x[1,2])
print(x[:,2])
6
[3 6 9]

视图和副本

x = np.array([1,2,3,4,5])
y = x[:3]

y[:] = 0
print(y)
print(x)
[0 0 0]
[0 0 0 4 5]

在这里,我们修改了 y 之后发现 x 也被改变了,这种和原有数组共享内存的数组被称为视图,所以需要使用 copy 来创建副本

x = np.array([1,2,3,4,5])
y = x[:2].copy()

y[:] = 0

print(y)
print(x)
[0 0]
[1 2 3 4 5]

这样子 x 的值就没有被修改了

数组的基本运算

x = np.array([[1,-1],
              [3,2]])

y = np.array([[0, 1],
              [-2,1]])
x+y
array([[1, 0],
       [1, 3]])

当 x 和 y 的维度及大小都相同时,直接相加

如果维度不同时,需要把小的维度拓展到和大的维度相同后再进行运算,就是对原数组进行复制,这种处理被叫做广播

x = np.array([[1,2],
              [3,4]])
y = np.array([[5,6]])
x+y
array([[ 6,  8],
       [ 8, 10]])

这里可以理解为

[1234]+[5656]=[68810]

通用函数

x = np.arange(5)
np.sqrt(x)
array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ])

对数组进行运算可以理解成对数组中的每个数单独进行运算

x = np.array([1,2,3,4])
y = np.array([4,3,2,1])
x > y
array([False, False,  True,  True])

矩阵运算

A = np.array([[1, -2],
              [2, 0]])
B = np.array([[3, 4],
              [-1, -3]])

C = A @ B
C
array([[ 5, 10],
       [ 6,  8]])

Matplotlib

导入

import matplotlib.pyplot as plt

基础图标

简单二维图表

图表对象是 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)

image.png