Skip to content

NumPy 运算

NumPy 是 Python 中用于数值计算的核心库,提供高性能的数组操作。

数组创建

python
import numpy as np

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

# 创建零数组
zeros = np.zeros(5)

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

# 创建空数组
empty = np.empty((2, 3))

# 创建范围数组
arr_range = np.arange(0, 10, 2)

# 创建随机数组
random = np.random.rand(3, 3)

# 创建正态分布数组
normal = np.random.randn(100)

数组操作

python
# 数组形状
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)  # (2, 3)

# 数组维度
print(arr.ndim)  # 2

# 数组大小
print(arr.size)  # 6

# 数据类型
print(arr.dtype)  # int64

# 改变形状
arr.reshape(3, 2)

# 展平数组
arr.flatten()

# 转置数组
arr.T

元素访问

python
# 访问元素
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr[0, 0])  # 1
print(arr[1, 2])  # 6

# 切片
print(arr[:, 1])  # [2, 5]
print(arr[0, :])  # [1, 2, 3]

# 条件索引
mask = arr > 3
print(arr[mask])  # [4, 5, 6]

# 花式索引
indices = [0, 2]
print(arr[:, indices])  # [[1, 3], [4, 6]]

数学运算

python
# 基本运算
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

print(arr1 + arr2)  # [5, 7, 9]
print(arr1 - arr2)  # [-3, -3, -3]
print(arr1 * arr2)  # [4, 10, 18]
print(arr1 / arr2)  # [0.25, 0.4, 0.5]

# 矩阵运算
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
print(np.dot(matrix1, matrix2))  # 矩阵乘法

# 数学函数
print(np.sin(arr1))
print(np.cos(arr1))
print(np.exp(arr1))
print(np.log(arr1))

统计函数

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

# 求和
print(np.sum(arr))  # 21
print(np.sum(arr, axis=0))  # [5, 7, 9]
print(np.sum(arr, axis=1))  # [6, 15]

# 均值
print(np.mean(arr))  # 3.5

# 标准差
print(np.std(arr))

# 最大值/最小值
print(np.max(arr))  # 6
print(np.min(arr))  # 1

# 中位数
print(np.median(arr))  # 3.5

线性代数

python
# 矩阵逆
matrix = np.array([[1, 2], [3, 4]])
print(np.linalg.inv(matrix))

# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(matrix)

# 奇异值分解
u, s, v = np.linalg.svd(matrix)

# 行列式
print(np.linalg.det(matrix))

# 求解线性方程组
A = np.array([[1, 2], [3, 4]])
b = np.array([5, 6])
x = np.linalg.solve(A, b)

性能优化

python
# 使用向量化操作
arr = np.arange(1000000)
result = arr * 2  # 比循环快很多

# 使用广播
arr1 = np.array([1, 2, 3])
arr2 = np.array([[1], [2], [3]])
result = arr1 + arr2  # 自动广播

# 使用视图而不是副本
arr = np.array([1, 2, 3, 4, 5])
view = arr[1:4]  # 视图
view[0] = 10  # 会影响原数组

# 使用 np.where 代替条件分支
arr = np.array([1, 2, 3, 4, 5])
result = np.where(arr > 3, arr * 2, arr)

注意事项

  1. 内存布局: NumPy 数组在内存中是连续存储的
  2. 数据类型: 选择合适的数据类型可以节省内存
  3. 广播规则: 理解广播规则可以简化代码
  4. 避免循环: 尽量使用向量化操作代替显式循环