Numpy核心知识详解
为何选择Numpy
Numpy的核心功能是提供高效的多维数组对象ndarray及配套的操作函数库。
相较于Python内置列表,其主要优势包括:
- 高效性:底层采用C语言实现,规避了Python循环带来的性能损耗
- 功能性:封装了丰富的数值计算方法
- 简洁性:能够以较少代码完成复杂的数据操作
1. Numpy基础:ndarray对象
1.1 构建数组
import numpy as np
# 基于列表构造
data_list = [10, 20, 30, 40]
vector = np.array(data_list)
print("一维向量:", vector)
nested_list = [[1, 2], [3, 4]]
matrix = np.array(nested_list)
print("二维矩阵:\n", matrix)
# 特殊数组生成
zero_matrix = np.zeros((2, 3)) # 全零矩阵
unit_matrix = np.ones((3, 2)) # 全一矩阵
uninit_matrix = np.empty((2, 2)) # 未初始化矩阵
fill_matrix = np.full((2, 2), 5) # 指定值填充矩阵
# 序列数组创建
step_array = np.arange(1, 10, 2) # 步长数组 [1, 3, 5, 7, 9]
linear_array = np.linspace(0, 2, 5) # 等间距数组 [0., 0.5, 1., 1.5, 2.]
# 单位矩阵
identity = np.eye(3)
print("单位矩阵:\n", identity)
# 随机数组生成
uniform_random = np.random.rand(2, 2) # 均匀分布随机数
normal_random = np.random.randn(2, 2) # 正态分布随机数
integer_random = np.random.randint(1, 6, (2, 2)) # 整数随机数
1.2 数组特征信息
tensor = np.random.randn(2, 3, 4)
print("维度数:", tensor.ndim) # 3
print("结构形状:", tensor.shape) # (2, 3, 4)
print("元素总量:", tensor.size) # 24
print("数据类型:", tensor.dtype) # float64
2. 数组基本操作
2.1 数据访问与筛选
sample = np.array([[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34]])
# 行列定位
print("首行数据:", sample[0]) # [11 12 13 14]
print("第二行第三列:", sample[1, 2]) # 23
# 区间切片
print("前两行:\n", sample[:2])
print("前两行最后两列:\n", sample[:2, 2:])
print("各行列二:\n", sample[:, 1]) # [12, 22, 32]
# 条件过滤(关键特性)
print("大于20的元素:", sample[sample > 20])
sample[sample > 20] = -1 # 替换符合条件元素
print("更新后矩阵:\n", sample)
2.2 结构变换
seq = np.arange(12)
print("原序列:", seq)
# 改变维度
reshaped = seq.reshape(4, 3)
print("重构为4x3:\n", reshaped)
# 降维处理
flattened = reshaped.flatten()
print("扁平化结果:", flattened)
# 矩阵转置
transposed = reshaped.T
print("转置矩阵:\n", transposed)
3. 数值计算机制
3.1 基础运算
x = np.array([2, 4, 6, 8])
y = np.array([1, 3, 5, 7])
print("x + y =", x + y) # [ 3 7 11 15]
print("x - y =", x - y) # [1 1 1 1]
print("x * y =", x * y) # [ 2 12 30 56] 元素相乘
print("x / y =", x / y) # [2. 1.33.. 1.2 1.14..]
print("x ^ 2 =", x ** 2) # [ 4 16 36 64]
3.2 广播原理
当参与运算的数组维度不一致时,Numpy会自动扩展较小数组以匹配较大数组。
| 广播准则 |
|---|
| 1. 从末尾维度开始对比 |
| 2. 若某维度长度相同或为1则可广播 |
| 3. 其余维度必须完全一致 |
# 标量广播示例
base = np.ones((2, 3))
outcome = base + 10
print("矩阵加常数:\n", outcome)
# 异形数组运算
row_vector = np.array([[1], [2], [3]]) # (3, 1)
col_vector = np.array([10, 20, 30]) # (3,)
# row_vector 扩展为 [[1,1,1],[2,2,2],[3,3,3]]
# col_vector 扩展为 [[10,20,30],[10,20,30],[10,20,30]]
print("行列向量相加:\n", row_vector + col_vector)
4. 通用函数应用
通用函数(ufunc)是对数组逐元素执行的函数,极大提升了计算效率。
elements = np.array([-2, -1, 0, 1])
# 数值函数
print("绝对值:", np.abs(elements))
print("平方根:", np.sqrt(np.abs(elements)))
print("自然指数:", np.exp(elements))
print("对数运算:", np.log(elements + 3))
# 三角函数
radians = np.array([0, np.pi/4, np.pi/2])
print("正弦值:", np.sin(radians))
# 统计分析
dataset = np.random.randn(4)
print("样本数据:", dataset)
print("总和:", np.sum(dataset))
print("平均值:", np.mean(dataset))
print("标准差:", np.std(dataset))
print("最大值:", np.max(dataset))
print("最小值位置:", np.argmin(dataset))
# 多维统计(指定维度)
grid = np.array([[1, 2], [3, 4], [5, 6]])
print("列方向求和:", np.sum(grid, axis=0)) # [9, 12]
print("行方向求和:", np.sum(grid, axis=1)) # [3, 7, 11]
5. 数组组合与拆分
block_a = np.array([[1, 2], [3, 4]])
block_b = np.array([[5, 6], [7, 8]])
# 合并操作
print("纵向合并:\n", np.vstack((block_a, block_b)))
print("横向合并:\n", np.hstack((block_a, block_b)))
print("axis=0合并:\n", np.concatenate((block_a, block_b), axis=0))
print("axis=1合并:\n", np.concatenate((block_a, block_b), axis=1))
# 分解操作
source = np.arange(12).reshape(3, 4)
print("源矩阵:\n", source)
parts = np.split(source, 2, axis=1) # 按列等分为2部分
print("分解结果:")
for idx, section in enumerate(parts):
print(f"片段{idx}:\n{section}")
6. 实践案例:成绩分析
# 模拟成绩数据:5名学生3科成绩
grades = np.random.randint(65, 100, size=(5, 3))
print("成绩表格:\n", grades)
# 学生总评与平均分
totals = np.sum(grades, axis=1)
averages = np.mean(grades, axis=1)
print("个人总分:", totals)
print("个人均分:", averages)
# 科目最高分查找
math_max = np.max(grades[:, 0])
print("数学最高分:", math_max)
# 筛选优秀学生
excellent_mask = averages > 85
print("高分学生编号:", np.where(excellent_mask))
print("高分学生成绩:\n", grades[excellent_mask])
# 成绩归一化处理
normalized_grades = (grades - np.min(grades)) / (np.max(grades) - np.min(grades))
print("归一化成绩:\n", normalized_grades)
核心要点汇总
| 类别 | 关键方法 |
|---|---|
| 数组创建 | array(), zeros(), ones(), arange(), linspace(), random |
| 属性查询 | ndim, shape, size, dtype |
| 数据访问 | 基础索引、条件筛选(核心技能) |
| 形态调整 | reshape(), flatten(), T |
| 数值运算 | 元素级操作、广播机制(重点难点) |
| 函数工具 | 数学统计函数,注意axis参数使用 |
| 结构操作 | vstack, hstack, concatenate, split |
推荐通过Jupyter Notebook实践上述示例,深入理解各项功能。掌握基础后可顺利过渡至Pandas学习阶段。