NumPy 数值计算¶
一句话概述:NumPy 是 Python 科学计算的基石,提供高性能的多维数组(ndarray)和数学运算,几乎所有数据科学/机器学习库都建立在它之上。最新版 NumPy 2.4(2026)。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| ndarray | N维数组 = NumPy 的核心数据结构(比 Python 列表快 50 倍) |
| dtype | 数据类型 = 数组元素的类型(int32、float64 等) |
| Broadcasting | 广播 = 不同形状的数组自动对齐运算 |
| Vectorization | 向量化 = 用数组运算代替 for 循环(快得多) |
| Axis | 轴 = 操作的维度方向(axis=0 按行,axis=1 按列) |
安装配置¶
基本使用¶
import numpy as np # 导入
# 创建数组
a = np.array([1, 2, 3, 4, 5]) # 从列表创建
b = np.zeros((3, 4)) # 3x4 全零矩阵
c = np.ones((2, 3)) # 2x3 全一矩阵
d = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
e = np.linspace(0, 1, 5) # 0到1均分5个点
f = np.random.randn(3, 3) # 3x3 标准正态随机
# 数组属性
print(f.shape) # 形状 (3, 3)
print(f.dtype) # 数据类型 float64
print(f.ndim) # 维度数 2
print(f.size) # 元素总数 9
# 索引和切片
arr = np.arange(12).reshape(3, 4) # 3x4 矩阵
print(arr[0, 1]) # 第0行第1列
print(arr[:, 2]) # 第2列所有行
print(arr[1:, :2]) # 第1行起,前2列
# 数组运算(向量化 — 无需 for 循环)
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print(x + y) # 逐元素加 [5, 7, 9]
print(x * y) # 逐元素乘 [4, 10, 18]
print(np.dot(x, y)) # 点积 32
print(x @ y) # 点积(@ 运算符)
# 统计函数
data = np.random.randn(1000) # 1000 个随机数
print(f"均值: {np.mean(data):.4f}") # 均值
print(f"标准差: {np.std(data):.4f}") # 标准差
print(f"中位数: {np.median(data):.4f}") # 中位数
print(f"最大值: {np.max(data):.4f}") # 最大值
print(f"百分位: {np.percentile(data, 95):.4f}") # 95 百分位
高级用法¶
广播机制¶
# 广播:不同形状自动对齐
matrix = np.ones((3, 4)) # 3x4 矩阵
vector = np.array([1, 2, 3, 4]) # 1x4 向量
result = matrix + vector # 自动扩展行维度
# 标准化(每列减去均值,除以标准差)
data = np.random.randn(100, 5) # 100 样本 5 特征
mean = data.mean(axis=0) # 每列均值
std = data.std(axis=0) # 每列标准差
normalized = (data - mean) / std # 广播标准化
线性代数¶
A = np.array([[1, 2], [3, 4]]) # 2x2 矩阵
print(np.linalg.det(A)) # 行列式
print(np.linalg.inv(A)) # 逆矩阵
eigenvalues, eigenvectors = np.linalg.eig(A) # 特征值分解
U, S, Vt = np.linalg.svd(A) # SVD 分解
条件筛选¶
data = np.random.randn(100) # 100 个随机数
positive = data[data > 0] # 筛选正数
outliers = data[np.abs(data) > 2] # 筛选异常值
np.where(data > 0, data, 0) # 负数替换为 0
常见报错¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
ValueError: shape mismatch | 数组形状不兼容 | 检查 .shape 属性 |
AxisError: axis out of bounds | 轴编号超范围 | 2D 数组只有 axis=0 和 1 |
MemoryError | 数组太大 | 用 float32 替代 float64 |
速查表¶
# === 创建 ===
np.array([1,2,3]) # 从列表
np.zeros((m,n)) # 全零
np.ones((m,n)) # 全一
np.eye(n) # 单位矩阵
np.arange(start, stop, step) # 等差
np.linspace(start, stop, num) # 均分
np.random.randn(m,n) # 正态随机
# === 变形 ===
arr.reshape(m,n) # 重塑
arr.T # 转置
arr.flatten() # 展平
np.concatenate([a,b], axis=0) # 拼接
np.split(arr, n) # 切分
# === 统计 ===
np.mean/std/var/min/max/sum(arr, axis=) # 基本统计
np.percentile(arr, q) # 百分位
np.corrcoef(x, y) # 相关系数
参考:NumPy 文档 | 最新版 2.4.1 (2026.01) | 更新于 2026 年