【NumPy第二期:深入学习NumPy:切片、索引与数组操作进阶】
🚀 作者 :“码上有前”
🚀 文章简介 :NumPy
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬
深入学习NumPy:切片、索引与数组操作进阶
摘要:本文聚焦 NumPy 中切片、索引、广播、数组迭代及位运算等核心进阶知识。从基础切片索引的灵活取值,到高级索引的复杂数据筛选,再到广播机制简化不同形状数组运算、迭代数组高效遍历元素,以及位运算拓展数值操作场景,结合丰富代码示例与清晰原理阐释,帮助读者扎实掌握 NumPy 进阶用法,解锁高效数据处理与科学计算技能。
一、引言
NumPy 作为 Python 科学计算的基石,其对数组的灵活操作能力是高效处理数据的关键。除基础数组创建与属性外,切片、索引、广播等进阶功能,能让我们精准提取数据、简化运算逻辑。本文将深入拆解这些核心知识,助力大家更自如地运用 NumPy 应对复杂场景。
二、NumPy 切片和索引:精准提取数组元素
(一)基础切片语法
NumPy 数组的切片类似 Python 列表,但支持多维操作,语法为 arr[start:stop:step]
,各维度用逗号分隔。
一维数组示例:
import numpy as np
arr_1d = np.arange(10) # 创建 [0,1,2,3,4,5,6,7,8,9]
# 取索引 2 到 7(不包含7),步长1
slice_1d = arr_1d[2:7]
print("一维切片结果:", slice_1d) # 输出 [2 3 4 5 6]
二维数组示例:
arr_2d = np.array([[1,2,3], [4,5,6], [7,8,9]])
# 取第1行(索引0),索引1到2的列
slice_2d = arr_2d[0, 1:3]
print("二维切片结果:\n", slice_2d) # 输出 [2 3]
(二)索引的多样玩法
- 整数索引:直接指定元素位置,多维数组可按维度逐个索引。
# 取二维数组第2行(索引1)第3列(索引2)元素
elem = arr_2d[1, 2]
print("整数索引取值:", elem) # 输出 6
- 布尔索引:用布尔数组筛选元素,常用于条件过滤。
# 筛选出大于5的元素
bool_idx = arr_2d > 5
filtered = arr_2d[bool_idx]
print("布尔索引结果:", filtered) # 输出 [6 7 8 9]
三、NumPy 高级索引:复杂数据筛选
(一)整数数组索引
通过传入整数数组,可提取任意位置的元素,支持多维选取。
# 取 (0,1)、(1,2)、(2,0) 位置的元素
rows = np.array([0, 1, 2])
cols = np.array([1, 2, 0])
advanced_idx = arr_2d[rows, cols]
print("整数数组索引结果:", advanced_idx) # 输出 [2 6 7]
(二)布尔数组与整数数组混合索引
灵活组合两种索引方式,满足复杂筛选需求(注意维度匹配规则)。
# 先布尔筛选行,再整数索引列
row_mask = np.array([True, False, True]) # 保留第0、2行
col_idx = np.array([0, 2]) # 取第0、2列
mixed_idx = arr_2d[row_mask][:, col_idx]
print("混合索引结果:\n", mixed_idx)
# 输出 [[1 3]
# [7 9]]
四、NumPy 广播(Broadcast):不同形状数组的运算魔法
(一)广播的核心规则
当两个数组形状不同时,NumPy 会自动扩展维度较小的数组,使其与较大数组“兼容”,规则如下:
- 维度从后往前比较,若某维度为 1 或与另一数组维度相等,则可广播。
- 最终扩展为两者维度的最大值。
示例:标量与数组运算
scalar = 2
arr = np.array([[1,2], [3,4]])
# 标量自动广播为 (2,2) 数组参与运算
result = arr * scalar
print("广播运算结果:\n", result)
# 输出 [[2 4]
# [6 8]]
示例:不同维度数组运算
arr_a = np.array([[1,2], [3,4]])
arr_b = np.array([5, 6]) # 形状 (2,),广播为 (2,2)
result_broadcast = arr_a + arr_b
print("不同维度广播结果:\n", result_broadcast)
# 输出 [[ 6 8]
# [ 8 10]]
(二)广播的应用场景
广播简化了循环运算,让代码更简洁,常用于:
- 批量数据的标量修正(如所有元素加/乘一个值)。
- 不同维度特征的组合运算(如矩阵与向量的逐行/列操作 )。
五、NumPy 迭代数组:遍历元素的高效方式
(一)基础迭代:for
循环遍历
直接遍历数组,多维数组默认按行(一维化)迭代。
# 遍历二维数组元素
for elem in arr_2d:print("行迭代元素:", elem)
# 输出 [1 2 3]、[4 5 6]、[7 8 9]# 遍历所有元素(扁平化)
for elem in arr_2d.flat:print("扁平迭代元素:", elem, end=" ")
# 输出 1 2 3 4 5 6 7 8 9
(二)nditer
迭代器:灵活控制遍历
支持指定遍历顺序(如 C
序按行、F
序按列)、数据类型等,适合复杂遍历场景。
# 按列优先顺序遍历
for elem in np.nditer(arr_2d, order='F'):print("按列遍历元素:", elem, end=" ")
# 输出 1 4 7 2 5 8 3 6 9
(三)迭代时修改元素
通过 op_flags
标记,可在迭代中修改数组值(需注意原数组是否可写)。
arr_copy = arr_2d.copy()
# 迭代时将元素加倍
for elem in np.nditer(arr_copy, op_flags=['readwrite']):elem[...] = elem * 2
print("迭代修改后数组:\n", arr_copy)
# 输出 [[ 2 4 6]
# [ 8 10 12]
# [14 16 18]]
六、NumPy 数组操作:重塑、拼接与拆分
(一)数组重塑:reshape
改变数组维度,元素总数需保持不变。
arr = np.arange(6)
# 重塑为 2 行 3 列
reshaped = arr.reshape(2, 3)
print("重塑后数组:\n", reshaped)
# 输出 [[0 1 2]
# [3 4 5]]
(二)数组拼接:concatenate
沿指定轴拼接多个数组,需保证除拼接轴外其他维度一致。
arr1 = np.array([[1,2], [3,4]])
arr2 = np.array([[5,6]])
# 沿 0 轴(行方向)拼接
concated = np.concatenate((arr1, arr2), axis=0)
print("拼接后数组:\n", concated)
# 输出 [[1 2]
# [3 4]
# [5 6]]
(三)数组拆分:split
按指定轴和位置拆分数组。
arr = np.arange(9).reshape(3, 3)
# 沿 0 轴拆分为 3 个小数组
split_arr = np.split(arr, 3, axis=0)
for sub_arr in split_arr:print("拆分后的子数组:\n", sub_arr)
# 分别输出 [[0 1 2]]、[[3 4 5]]、[[6 7 8]]
七、NumPy 位运算:二进制层面的操作
(一)常用位运算函数
NumPy 提供 bitwise_and
(与)、bitwise_or
(或)、bitwise_xor
(异或)、invert
(非)等函数,操作数组元素的二进制位。
a = np.array([1, 2], dtype=np.int8) # 二进制:00000001、00000010
b = np.array([3, 1], dtype=np.int8) # 二进制:00000011、00000001# 按位与运算
and_result = np.bitwise_and(a, b)
print("按位与结果:", and_result) # 输出 [1 0](二进制 00000001、00000000)# 按位或运算
or_result = np.bitwise_or(a, b)
print("按位或结果:", or_result) # 输出 [3 3](二进制 00000011、00000011)
(二)位运算的应用场景
位运算常用于:
- 硬件控制(如寄存器标志位操作)。
- 数据压缩与编码(利用二进制位特性优化存储)。
- 特定算法(如哈希计算、图像处理的掩码操作 )。
八、总结
本文围绕 NumPy 切片、索引、广播、迭代、数组操作及位运算展开,这些进阶功能是高效处理数组数据的关键。切片与索引让我们精准“抓取”数据,广播简化不同形状数组运算,迭代实现元素灵活遍历,数组操作覆盖重塑、拼接等实用需求,位运算拓展二进制层面玩法。熟练掌握这些知识,能大幅提升 NumPy 编程效率,为数据分析、机器学习等上层应用筑牢基础。后续可结合实际项目,持续深化对这些功能的运用,解锁更复杂的科学计算场景!
文中代码可直接在 Python 环境(安装 NumPy 库)运行验证,配合输出结果理解原理。若需更深入学习某部分(如广播的复杂维度匹配案例),可进一步扩展示例补充~