安装numpypip install numpy --user

引入numpyimport numpy as np

1 Numpy基本操作

1.1 列表转为矩阵

1
2
3
4
5
6
array = np.array([
[1, 4, 7],
[2, 5, 8]
])

print(array)

image-20220501111528474

1.2 查看维度

1
print('Number of dim: ', array.ndim)

image-20220501111657214

1.3 查看行数和列数

1
print('rows and columns: ', array.shape)

image-20220501111817186

1.4 查看元素个数

1
print('Number of elements: ', array.size)

image-20220501112036029

2 Numpy创建Array

2.1 维度

  • 一维

    1
    2
    3
    4
    5
    # 一维array
    a = np.array([2, 43, 29], dtype=np.int32) # np.int报warning

    print(a)
    print(a.dtype)

    image-20220501112543629

  • 多维

    1
    2
    3
    4
    5
    6
    7
    8
    # 多维array
    a = np.array([[1, 4, 7],
    [2, 5, 8],
    [3, 6, 9],
    [0, 0, 0]])

    print(a)
    print(a.dtype)

    image-20220501112722555

2.2 填充数据

  1. 创建全零数组

    1
    2
    3
    # 创建全零数组
    a = np.zeros((2, 5))
    print(a)

    image-20220501112905000

  2. 创建全一数组

    1
    2
    3
    # 创建全一数组,同时指定数据类型
    a = np.ones((2, 5), dtype=np.int32)
    print(a)

    image-20220501113020056

  3. 创建全空数组

    1
    2
    3
    4
    5
    # 创建全空数组,其实每个值都是接近于零的数
    a = np.empty((2, 5))
    print(a)
    b = np.empty((2, 5))
    print(b)

    image-20220501113217817

  4. 创建连续数组
    创建 [34, 45) 的数据,步长为3

    1
    2
    3
    4
    # 创建连续数组
    # 创建 [34, 45) 的数据,步长为3
    a = np.arange(34, 45, 3)
    print(a)

    image-20220501113433548

  5. 创建连续型数据

    1
    2
    3
    4
    # 创建线段型数据
    # 开始端1,结束端10,且分割成20个数据,生成线段
    a = np.linspace(1, 10, 20)
    print(a)

    image-20220501114224949

2.3 reshape操作

使用reshape改变数组形状:

1
2
3
4
# 使用reshape改变数组的形状
a = np.arange(10, 40, 2)
b = a.reshape((3, 5))
print(b)

image-20220501131518111

linspace使用reshape:

1
2
3
a = np.linspace(1, 10, 20)
b = a.reshape((5, 4))
print(b)

image-20220501131630887

3 Numpy基本运算

3.1 一维矩阵运算

1
2
3
4
5
6
7
8
9
10
11
# 一维矩阵运算
a = np.array([5, 7, 14, 83])
b = np.arange(4)
print('a: ', a, 'b: ', b)
print('a-b: ', a - b)
print('a*b: ', a * b)
print('a=b: ', a == b)
print('各维之和: ', a.dot(b))
print('b**2: ', b**2)
print('sin(a): ', np.sin(a)) # 数学函数
print('a<2?: ', a < 10)

image-20220501132306111

3.2 多维矩阵运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 多维矩阵运算
a = np.array([[1, 1], [0, 1]])
b = np.arange(4).reshape((2, 2))

# 矩阵乘法
print('乘法1: ', a.dot(b))
print('乘法2: ', np.dot(a, b))

print('求和: ', np.sum(a))
print('最大最小值: ', np.max(b), np.min(b))

# axis=0,列为查找单元;axis=1,行为查找单元
print('每行的和: ', np.sum(b, axis=1))
print('每列的最小值: ', np.min(b, axis=0))

image-20220501134032005

3.3 基本计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 基本计算
a = np.arange(2, 14).reshape((3, 4))
print(a)
# 最小元素索引
print('最小元素索引: ', np.argmin(a))
# 最大元素索引
print('最大元素索引: ', np.argmax(a))
# 求整个矩阵的均值
print('均值: ', np.mean(a))
print('均值: ', np.average(a))
# 中位数
print('中位数: ', np.median(a))
# 累加
print('累加: ', np.cumsum(a))
# 累差运算
b = np.array([[3, 5, 9],
[4, 8, 10]])
print('累差: ', np.diff(b))
# 返回非零元素位置
c = np.array([[0, 5, 9],
[4, 0, 10]])
print(np.nonzero(b))
print(np.nonzero(c))

image-20220501135221396

1
2
3
4
5
6
7
8
9
10
11
12
A = np.arange(14, 2, -1).reshape((3, 4))  # -1表示反向递减一个步长
print(A)
# 仿照列表排序
print('仿照列表排序')
print(np.sort(A))
# 矩阵转置
print('矩阵转置')
print(np.transpose(A))
print(A.T) # 不会修改A
# clip
print('clip')
print(np.clip(A, 5, 9))

image-20220501135821297

clip(Array, Array_min, Array_max)

Array_min < X < Array_maxX表示矩阵A中的数:

  1. 如果满足上述关系,则原数不变;
  2. 如果X < Array_min,则将矩阵中X变为Array_min
  3. 如果X > Array_max,则将矩阵中X变为Array_max

4 Numpy索引与切片

1
2
3
4
5
6
7
8
9
10
11
array = np.arange(3, 15)

print(array)
print(array[3])

arr = array.reshape(3, 4)
print(arr)
print(arr[2])
print(arr[0][2])
print(arr[0, 2])
print(arr[1, 1:3])

image-20220503092752997

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 打印行
print('打印行')
for row in arr:
print(row)

# 打印列:将arr转置
print('打印列')
for column in arr.T:
print(column)

# 多维转一维
print(arr.flatten())

for item in arr.flat:
print(item)

image-20220503093528061

5 Numpy array合并

5.1 数组合并

1
2
3
4
5
6
7
8
9
10
11
12
a = np.array([1, 2, 4])
b = np.array([3, 5, 6])
# vertical stack 上下合并,对括号的两个整体操作
# horizontal stack左右合并
print(np.vstack((a, b)))
print(np.hstack((a, b)))

c = np.vstack((a, b))
print(a.shape, b.shape, c.shape)

d = np.hstack((a, b))
print(a.shape, b.shape, d.shape)

image-20220503094326256

5.2 数组转置为矩阵

1
2
3
print(a[np.newaxis, :])
print(a[np.newaxis, :].shape)
print(a[:, np.newaxis])

image-20220503100102569

5.3 多个矩阵合并

1
2
3
4
5
6
7
8
9
print(a[:, np.newaxis].shape)
A = a[:, np.newaxis]
B = b[:, np.newaxis]
print(A)
print(B)
# axis=0纵向合并
print(np.concatenate((A, A, B), axis=0))
# axis=1横向合并
print(np.concatenate((A, B, B, A), axis=1))

image-20220503100439357

6 Numpy array分割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 构造3行四列矩阵
a = np.arange(12).reshape((3, 4))
print(a)

# 等量分割
# 纵向分割同横向合并的axis
print(np.split(a, 2, axis=1))
# 横向分割同纵向合并的axis
print(np.split(a, 3, axis=0))

# 不等量分割
print(np.array_split(a, 3, axis=1))

# 横向分割
print(np.vsplit(a, 3)) # 等价于print(np.split(A,3,axis=0))
print(np.hsplit(a, 2)) # 等价于print(np.split(A,2,axis=1))

image-20220503100919066

7 Numpy copy与=

  • =赋值方式会带有关联性
  • copy()赋值方式没有关联性
1
2
3
4
5
6
7
8
9
10
11
12
a = np.arange(4)
b = a
c = b
d = a

a[0] = 10
d[1:3] = [15, 82]

print(a)
print(b)
print(c)
print(d)

image-20220503101844777

1
2
3
4
5
6
7
8
9
10
11
12
a = np.arange(4)
b = a.copy()
c = b.copy()
d = a.copy()

a[0] = 10
d[1:3] = [15, 82]

print('a', a)
print('b', b)
print('c', c)
print('d', d)

image-20220503102019235

8 广播机制

numpy数组间的基础运算是一对一,也就是a.shape == b.shape,但是当两者不一样的时候,就会自动触发广播机制

1
2
3
4
5
6
7
8
9
a = np.array([[0, 0, 0],
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]])
b = np.array([0, 1, 2])
print(a + b)

b = np.tile([0, 1, 2], (4, 1))
print(a + b)

image-20220503103942394

只有当两个数组的trailing dimensions compatible时才会触发广播,否则报错ValueError: frames are not aligned exception。尾部维度必须兼容。

9 常用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# np.bincount()
x = np.array([1, 2, 3, 3, 4, 2, 1])
print(np.bincount(x))
w = np.array([0.3, 0.5, 0.7, 0.6, 0.1, -0.9, 1])
print(np.bincount(x, weights=w, minlength=7))

# np.argmax()
x = [[1, 2, 4],
[7, 5, 2]]
print(np.argmax(x))
x = np.array([1, 2, 3, 3, 0, 1, 4])
print(np.argmax(np.bincount(x)))

# 求取精度
print(np.around([-0.6, 1.2798, 2.357, 9.67, 13], decimals=0)) # 取指定位置的精度
print(np.around([1, 2, 5, 50, 56, 190], decimals=-2))

# 计算沿指定轴第N维的离散差值
x = np.arange(1, 16).reshape((3, 5))
print(np.diff(x, axis=1)) # 默认axis=1
print(np.diff(x, axis=0))

# 取整
print(np.floor([-0.6, -1.4, -0.1, -1.8, 0, 1.4, 1.7]))

# 取上限
print(np.ceil([1.2, 1.5, 1.8, 2.1, 2.0, -0.5, -0.6, -0.3]))

# 查找
# 利用np.where实现小于0的值用0填充,大于0的数不变
x = np.array([[1, 0],
[2, -2],
[-2, 1]])
print(np.where(x > 0, x, 0))

image-20220503105626161