Featured image of post Numpy使用手册

Numpy使用手册

Python中numpy简单使用介绍

创建数组

从列表创建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 一维数组
arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d)  # [1 2 3 4 5]

# 二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d)
# [[1 2 3]
#  [4 5 6]]

# 三维数组
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3d)

特殊数组创建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 全零数组
zeros = np.zeros((3, 4))
print(zeros)

# 全一数组
ones = np.ones((2, 3))
print(ones)

# 单位矩阵
identity = np.eye(3)
print(identity)

# 等差数列
lin_arr = np.linspace(0, 10, 5)  # 从0到10,5个等间距数
print(lin_arr)  # [ 0.   2.5  5.   7.5 10. ]

# 等差数列(指定步长)
arange_arr = np.arange(0, 10, 2)  # 从0到10,步长为2
print(arange_arr)  # [0 2 4 6 8]

# 随机数组
random_arr = np.random.random((2, 3))  # 0-1之间的随机数
print(random_arr)

数组属性

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

print("数组:", arr)
print("维度:", arr.ndim)        # 2
print("形状:", arr.shape)       # (2, 3)
print("元素总数:", arr.size)    # 6
print("数据类型:", arr.dtype)   # int64
print("元素大小(字节):", arr.itemsize)  # 8

数组索引与切片

一维数组

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

print(arr[2])        # 2
print(arr[2:5])      # [2 3 4]
print(arr[:5])       # [0 1 2 3 4]
print(arr[5:])       # [5 6 7 8 9]
print(arr[::2])      # [0 2 4 6 8] 步长为2
print(arr[::-1])     # [9 8 7 6 5 4 3 2 1 0] 反转

多维数组

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

print(arr[0, 1])     # 2
print(arr[1, :])     # [4 5 6] 第二行
print(arr[:, 1])     # [2 5 8] 第二列
print(arr[0:2, 1:3]) # [[2 3] [5 6]] 子数组

布尔索引

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

# 选择大于3的元素
mask = arr > 3
print(mask)          # [False False False True True True]
print(arr[mask])     # [4 5 6]

# 直接使用条件
print(arr[arr % 2 == 0])  # [2 4 6] 偶数

数组操作

形状操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
arr = np.arange(12)
print("原始数组:", arr)

# 重塑形状
reshaped = arr.reshape(3, 4)
print("重塑后:\n", reshaped)

# 展平
flattened = reshaped.flatten()
print("展平:", flattened)

# 转置
transposed = reshaped.T
print("转置:\n", transposed)

数组拼接

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

# 垂直拼接
v_stack = np.vstack((a, b))
print("垂直拼接:\n", v_stack)

# 水平拼接
h_stack = np.hstack((a, b))
print("水平拼接:\n", h_stack)

数组分割

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
arr = np.arange(12).reshape(3, 4)
print("原始数组:\n", arr)

# 水平分割
h_split = np.hsplit(arr, 2)
print("水平分割:")
for part in h_split:
    print(part)

# 垂直分割
v_split = np.vsplit(arr, 3)
print("垂直分割:")
for part in v_split:
    print(part)

数学运算

基本运算

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

print("a + b =", a + b)  # [ 6  8 10 12]
print("a - b =", a - b)  # [-4 -4 -4 -4]
print("a * b =", a * b)  # [ 5 12 21 32]
print("a / b =", a / b)  # [0.2 0.333 0.429 0.5]
print("a ** 2 =", a ** 2)  # [ 1  4  9 16]

通用函数

1
2
3
4
5
6
7
arr = np.array([0, np.pi/2, np.pi])

print("sin:", np.sin(arr))      # [0. 1. 0.]
print("cos:", np.cos(arr))      # [1. 0. -1.]
print("exp:", np.exp(arr))      # 指数函数
print("log:", np.log(arr + 1))  # 自然对数
print("sqrt:", np.sqrt(arr))    # 平方根

统计函数

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

print("数组:\n", arr)
print("总和:", np.sum(arr))           # 21
print("平均值:", np.mean(arr))        # 3.5
print("标准差:", np.std(arr))         # 1.7078
print("方差:", np.var(arr))           # 2.9167
print("最小值:", np.min(arr))         # 1
print("最大值:", np.max(arr))         # 6
print("沿轴0求和:", np.sum(arr, axis=0))  # [5 7 9]
print("沿轴1求和:", np.sum(arr, axis=1))  # [6 15]

线性代数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 矩阵乘法
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

dot_product = np.dot(a, b)
print("矩阵乘法:\n", dot_product)

# 行列式
det = np.linalg.det(a)
print("行列式:", det)

# 逆矩阵
inv = np.linalg.inv(a)
print("逆矩阵:\n", inv)

# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(a)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)

随机数生成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 设置随机种子(保证结果可重现)
np.random.seed(42)

# 均匀分布
uniform = np.random.rand(3, 3)  # 0-1均匀分布
print("均匀分布:\n", uniform)

# 正态分布
normal = np.random.randn(3, 3)  # 标准正态分布
print("正态分布:\n", normal)

# 整数随机数
integers = np.random.randint(0, 10, (2, 3))  # 0-10的整数
print("整数随机数:\n", integers)

# 随机排列
arr = np.arange(10)
np.random.shuffle(arr)
print("随机排列:", arr)

数组保存与读取

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建示例数组
arr = np.arange(12).reshape(3, 4)

# 保存为文本文件
np.savetxt('array.txt', arr)

# 从文本文件读取
loaded = np.loadtxt('array.txt')
print("从文件读取:\n", loaded)

# 保存为二进制文件
np.save('array.npy', arr)

# 从二进制文件读取
loaded_binary = np.load('array.npy')
print("从二进制文件读取:\n", loaded_binary)

# 保存为压缩的二进制文件
np.savez('array_compressed.npz', my_array=arr)

# 从压缩文件读取
loaded_compressed = np.load('array_compressed.npz')
print("从压缩文件读取:\n", loaded_compressed['my_array'])

实用技巧

广播机制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 数组与标量的运算(广播)
arr = np.array([[1, 2, 3], [4, 5, 6]])
result = arr + 10  # 每个元素加10
print("广播加法:\n", result)

# 不同形状数组的运算
a = np.array([[1], [2], [3]])  # 形状 (3, 1)
b = np.array([4, 5, 6])        # 形状 (3,)
result = a + b  # 广播为 (3, 3)
print("形状广播:\n", result)

条件运算

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

# where函数
result = np.where(arr > 3, arr, 0)  # 大于3的保留,其他设为0
print("条件运算:", result)  # [0 0 0 4 5]

# 布尔运算
mask = (arr > 2) & (arr < 5)  # 2 < arr < 5
print("布尔掩码:", mask)      # [False False True True False]
恍如昨日,嗤笑今朝
使用 Hugo 构建
主题 StackJimmy 设计