数组创建

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
import numpy as np

# 从列表创建数组
arr = np.array([1, 2, 3, 4, 5])

# 创建全零数组
zeros = np.zeros((3, 4))

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

# 创建指定范围的数组
range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]

# 创建线性间隔数组
linspace_arr = np.linspace(0, 1, 5) # [0.0, 0.25, 0.5, 0.75, 1.0]

# 创建随机数组
random_arr = np.random.rand(3, 3) # 3x3 均匀分布随机数
randn_arr = np.random.randn(3, 3) # 3x3 标准正态分布随机数

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

# 创建对角矩阵
diagonal = np.diag([1, 2, 3, 4])

数组属性

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

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

数组操作

形状操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
arr = np.arange(12)

# 改变形状
reshaped = arr.reshape(3, 4)

# 展平数组
flattened = arr.flatten() # 返回拷贝
raveled = arr.ravel() # 返回视图

# 转置
transposed = reshaped.T

# 增加维度
expanded = np.expand_dims(arr, axis=0)

# 拼接数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
concatenated = np.concatenate((a, b), axis=0) # 垂直拼接
vstacked = np.vstack((a, b)) # 垂直拼接
hstacked = np.hstack((a, a.T)) # 水平拼接

数组分割

1
2
3
4
5
6
7
arr = np.arange(9).reshape(3, 3)

# 水平分割
split_h = np.hsplit(arr, 3)

# 垂直分割
split_v = np.vsplit(arr, 3)

数学运算

基本运算

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

# 元素级运算
add = a + b # [5, 7, 9]
sub = a - b # [-3, -3, -3]
mul = a * b # [4, 10, 18]
div = b / a # [4., 2.5, 2.]
power = a ** 2 # [1, 4, 9]
mod = b % a # [0, 1, 0]

# 矩阵乘法
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])
dot_product = np.dot(matrix_a, matrix_b)
# 或使用 @ 运算符
matrix_product = matrix_a @ matrix_b

通用函数(ufunc)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
arr = np.array([1, 2, 3])

# 数学函数
sqrt_arr = np.sqrt(arr) # 平方根
exp_arr = np.exp(arr) # 指数
log_arr = np.log(arr) # 自然对数
sin_arr = np.sin(arr) # 正弦

# 统计函数
mean = np.mean(arr) # 平均值
std = np.std(arr) # 标准差
var = np.var(arr) # 方差
sum_all = np.sum(arr) # 所有元素和
sum_axis = np.sum(matrix_a, axis=0) # 沿轴求和

# 比较运算
comparison = a > b # [False, False, False]

聚合函数

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

print(np.min(arr)) # 最小值: 1
print(np.max(arr)) # 最大值: 5
print(np.argmin(arr)) # 最小值索引: 0
print(np.argmax(arr)) # 最大值索引: 4
print(np.cumsum(arr)) # 累积和: [1, 3, 6, 10, 15]

广播机制

NumPy 广播规则:当两个数组维度不同时,较小的数组会”广播”到较大数组的形状。

1
2
3
4
5
6
7
8
9
10
11
# 标量与数组
arr = np.array([1, 2, 3])
result = arr + 5 # [6, 7, 8]

# 不同形状数组
a = np.array([[1], [2], [3]]) # 形状 (3, 1)
b = np.array([1, 2, 3]) # 形状 (3,)
result = a + b # 形状 (3, 3)
# [[2, 3, 4],
# [3, 4, 5],
# [4, 5, 6]]

索引与切片

基本索引

1
2
3
4
5
6
7
arr = np.arange(10)          # [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]
print(arr[::-1]) # 反转数组: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

多维数组索引

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

print(arr_2d[1, 2]) # 6
print(arr_2d[0:2, 1:3]) # [[2, 3], [5, 6]]
print(arr_2d[:, 1]) # 第二列: [2, 5, 8]

布尔索引

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

# 使用条件索引
filter = arr > 2
print(arr[filter]) # [3, 4, 5]

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

花式索引

1
2
3
4
5
6
7
8
arr = np.arange(12).reshape(3, 4)

# 使用整数数组索引
print(arr[[0, 2], [1, 3]]) # 获取(0,1)和(2,3)位置的元素: [1, 11]

# 使用布尔数组
mask = np.array([True, False, True])
print(arr[mask]) # 第一行和第三行

文件操作

1
2
3
4
5
6
7
8
9
10
# 保存和加载数组
arr = np.arange(10)

# 保存为二进制格式
np.save('array.npy', arr)
loaded = np.load('array.npy')

# 保存为文本格式
np.savetxt('array.txt', arr)
loaded_txt = np.loadtxt('array.txt')