NumPy的安装

python
1
2
pip install numpy
conda list numpy
python
1
2
import numpy as np
print(np.__version__)

NumPy属性

python
1
2
3
4
5
6
Array = np.array([[1,2,3],
[2,3,4]])
print(Array)
print('number of dim: ', Array.ndim)
print('shape: ', Array.shape)
print('size: ', Array.size)
python
1
2
3
4
5
6
# 输出
[[1 2 3]
[2 3 4]]
number of dim: 2
shape: (2, 3)
size: 6

NumPy创建array

NumPy中的数据类型

  • NumPy中的常见数据类型有

np.int_np.int8np.int16np.int32np.int64

np.float16np.float32np.float64

  • 如果不指定dtype, NumPy默认类型为float64
python
1
2
# np.int_是np.int32类型
a = np.array([2, 23, 4], dtype=np.int_)

定义一个元素全为0的矩阵

python
1
a = np.zeros((3,4))

定义一个元素全为1的矩阵

python
1
a = np.ones((3,4))

定义一个空矩阵

python
1
a = np.empty((2,3))
python
1
2
3
# 输出得到一个元素几乎全为0的矩阵
[[6.23042070e-307 4.67296746e-307 1.69121096e-306]
[7.56596412e-307 7.56595733e-307 5.18768928e-322]]

用arange生成一个数列

python
1
a = np.arange(10,20,2) # 从10到20步长为2生成数列
python
1
2
# 输出
[10 12 14 16 18]

用linspace生成一个数列

python
1
a = np.linspace(0, 1, 5) # 在0到1之间生成5个数据
python
1
2
# 输出
[0. 0.25 0.5 0.75 1. ]

将数列reshape成矩阵

reshape后的矩阵元素个数必须和原数列的元素个数相对应,否则会报错

python
1
a = np.arange(12).reshape((3,4))
python
1
2
3
4
# 输出
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

可以reshape元组列表等非NumPy的数据类型,返回NumPy数据类型

python
1
2
3
4
a = (1,2,3,4,5,6)
print(a,type(a),np.shape(a))
b = np.reshape(a,[2,3])
print(b,type(b),b.shape)
python
1
2
3
4
# 输出
(1, 2, 3, 4, 5, 6) <class 'tuple'> (6,)
[[1 2 3]
[4 5 6]] <class 'numpy.ndarray'> (2, 3)

将矩阵flatten成数列

python
1
a.flatten()

NumPy的基础运算

NumPy的四则运算和乘方

+-*\**

  • NumPy参与四则运算的两个向量必须是一样形状的,否则会报错
python
1
ValueError: operands could not be broadcast together with shapes (5,) (4,)

NumPy的三角函数

np.sin()np.cos()np.tan()

矩阵的乘法

python
1
2
3
A*B         #矩阵元素对应相乘
np.dot(A,B) #矩阵乘法
A.dot(B) #矩阵乘法

矩阵的转置

python
1
2
np.transpose(A)
A.T

最大值、最小值、求和

python
1
2
3
np.sum(a) # 所有元素的和
np.min(a, axis=0) # 每一列的最小值
np.max(a, axis=1) # 每一行的最大值

最大值最小值的索引

python
1
2
np.argmax(a, axis=1) # 每一行的最大值的索引
np.argmin(a, axis=0) # 每一列的最小值的索引

均值

python
1
2
3
np.mean(a)         # 所有元素的均值
np.mean(a, axis=0) # 每一列的均值
np.mean(a, axis=1) # 每一行的均值

加权平均

python
1
np.average([a,b,c], weights = [aw,bw,cw]) #加权平均

这个式子在求加权平均,其计算式如下

aawaw+bw+cw+bbwaw+bw+cw+ccwaw+bw+cwa\cdot\frac{a_w}{a_w+b_w+c_w} +b\cdot\frac{b_w}{a_w+b_w+c_w} +c\cdot\frac{c_w}{a_w+b_w+c_w}

中位数

python
1
2
# 可以进行axis操作
np.median(a)

累加

python
1
np.cumsum([a1,a2,a3])

上面的式子会输出如下结果

[a1,a1+a2,a1+a2+a3]\begin{bmatrix} a_1,&a_1+a_2,&a_1+a_2+a_3 \end{bmatrix}

累差

python
1
np.diff([a1,a2,a3,a4])

上面的式子会输出如下结果

[a2a1,a3a2,a4a3]\begin{bmatrix} a_2-a_1,&a_3-a_2,&a_4-a_3 \end{bmatrix}

输出非零元素的坐标

python
1
print(np.nonzero(np.array([[1,0,1],[0,1,0]])))
python
1
2
# 输非零元素的坐标[0,0],[0,2],[1,1]
(array([0, 0, 1], dtype=int64), array([0, 2, 1], dtype=int64))

排序

python
1
np.sort(np.array([[1,7,2],[9,2,6]]),axis=None)
python
1
2
3
4
5
6
7
8
# 排序前
[[1 7 2]
[9 2 6]]
# 默认axis=-1,按照最后一个维度排序
[[1 2 7]
[2 6 9]]
# 指定axis=None,矩阵会被展平
[1 2 2 6 7 9]

clip函数

python
1
numpy.clip(a, a_min, a_max, out=None)

将a中元素小于a_min的变成a_min, 大于a_max的变成a_max

Numpy的随机数

生成均匀分布的随机数

  • 生成[low,high)[low,high)上均匀分布的随机数, 默认分布区间是[0,1.0)[0, 1.0)
  • np.random.uniform() 不可指定dtype, 其生成的随机数的类型是float
python
1
np.random.uniform(low=0.0, high=1.0, size=None)
python
1
2
3
>>> a = np.random.uniform()
>>> print(a, type(a))
0.5751878527508482 <class 'float'>
python
1
2
3
>>> b = np.random.uniform(size=1)
>>> print(b, type(b))
[0.56519959] <class 'numpy.ndarray'>
python
1
2
3
4
>>> c = np.random.uniform(low=-1, high=1, size=[2,3])
>>> print(c, type(c))
[[ 0.86854768 -0.24873633 0.26262462]
[-0.91575207 -0.26320594 -0.04508716]] <class 'numpy.ndarray'>

生成均匀分布的随机整数

生成正太分布的随机数

python
1
np.random.normal(loc=0.0, scale=1.0, size=None)
python
1
2
3
4
5
>>> mu, sigma = 0, 0.1 # mean and standard deviation
>>> s = np.random.normal(mu, sigma, size=[2,3])
>>> print(s, type(s))
[[ 0.01428685 -0.019985 -0.04419828]
[-0.02343732 -0.05882594 0.02499089]] <class 'numpy.ndarray'>

NumPy的索引

矩阵的索引

python
1
2
3
4
5
6
7
8
9
10
11
>>> A = np.arange(0,9,1).reshape(3,3)
>>> print(A)
[[0 1 2]
[3 4 5]
[6 7 8]]
# 输出单个元素
>>> print(A[2,1])
7
# 使用冒号:
>>> print(A[0,0:3:2])
[0 2]

矩阵的迭代

python
1
2
3
4
5
6
7
8
# 以行进行迭代(默认以行进行迭代)
for i in A:
print(i)

# 输出
[0 1 2]
[3 4 5]
[6 7 8]
python
1
2
3
4
5
6
7
8
# 以列进行迭代
for i in A.T:
print(i)

# 输出
[0 3 6]
[1 4 7]
[2 5 8]
python
1
2
3
4
5
6
7
8
9
# 以元素进行迭代
for i in A.flat:
print(i)

# 输出
0
1
...
8

NumPy的array的合并

矩阵的合并

python
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> A = np.array([1,1,1])
>>> B = np.array([2,2,2])

# 竖直方向的合并 vertical stack
>>> C = np.vstack((A,B))
>>> print(C)
[[1 1 1]
[2 2 2]]

# 水平方向的合并 horizontal stack
>>> D = np.hstack((A,B))
>>> print(D)
[1 1 1 2 2 2]
python
1
2
3
4
5
>>> A = np.array([1,1,1])
>>> B = np.array([2,2,2])
>>> C = np.array([3,3,3])
>>> print(np.concatenate((A,B,C),axis=0))
[1 1 1 2 2 2 3 3 3]

向量的转置

  • [:]是切片操作, np.newaxis就是None, 增加一个空的维度
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> A = np.array([1,1,1])
>>> print(A[:],(A[:].shape))
[1 1 1] (3,)

>>> print(A[:,np.newaxis],(A[:,np.newaxis].shape))
[[1]
[1]
[1]] (3, 1)

>>> print(A[:,None],(A[:,None].shape))
[[1]
[1]
[1]] (3, 1)

>>> print(A.reshape(3,1),A.reshape(3,1).shape)
[[1]
[1]
[1]] (3, 1)
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> A = np.array([1,1,1])[:,np.newaxis]
>>> B = np.array([2,2,2])[:,np.newaxis]
>>> C = np.array([3,3,3])[:,np.newaxis]
>>> print(np.concatenate((A,B,C),axis=1))
[[1 2 3]
[1 2 3]
[1 2 3]]
>>> print(np.concatenate((A,B,C),axis=0))
[[1]
[1]
[1]
[2]
[2]
[2]
[3]
[3]
[3]]

NumPy的array的分割

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> A = np.arange(12).reshape((3,4))
>>> print(A)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

>>> print(np.split(A,3,axis=0))
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
>>> print(np.split(A,4,axis=1))
[array([[0],
[4],
[8]]),
array([[1],
[5],
[9]]),
array([[ 2],
[ 6],
[10]]),
array([[ 3],
[ 7],
[11]])]
  • 指定分割位置
python
1
2
3
4
5
6
7
8
9
10
11
# 指定分割位置, []中的数字是分割的位置,[2,3]表示分别在第2列和第3列前面进行一次分割
>>> print(np.split(A,[2,3],axis=1))
[array([[0, 1],
[4, 5],
[8, 9]]), #第2列前有第0和第1列
array([[ 2],
[ 6],
[10]]), #第3列前有第2列
array([[ 3],
[ 7],
[11]])] #剩下第3列

copy和deep copy

  • 直接使用=在python中相当于c++中的引用
python
1
2
a = np.arange(3) 
b = a # 这里相当于定义了b是a的引用, b和a对应同一块存储空间, 改变a的值也会同时改变b的值
  • 赋值操作deep copy
python
1
2
a = np.arange(3) 
b = a.copy() # deep copy

savetxt和loadtxt

python
1
2
3
4
5
data = np.arange(10, dtype=np.float64)
# save数据
np.savetxt('./data.txt',data)
# load数据
data1 = np.loadtxt('./data.txt', dtype=np.float64)