NumPy数组切片语法
NumPy切片基于视图而非副本的核心机制掌握这个原则能避免大量坑。让我从基础到高级逐层拆解一、基础语法与维度NumPy切片遵循[start:终止:step]的通用模式不同维度用逗号分隔import numpy as np # 一维数组切片 arr np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) print(arr[2:7]) # [2 3 4 5 7] start包含终止不包含 print(arr[::2]) # [0 2 4 6 8] step2默认从头到尾 print(arr[::-1]) # [9 8 7 6 5 4 3 2 1 0] step-1实现反转关键点start、终止、step都可以省略start默认为0终止默认为维度长度step默认为1二、多维切片的优雅设计NumPy的多维切片通过逗号分隔实现对每个维度的独立控制# 二维数组 arr2d np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]) # 选取第1-2行第2-3列从0开始计数 print(arr2d[1:3, 2:4]) # [[ 6 7] # [10 11]] # 使用步长跳跃选择 print(arr2d[::2, ::2]) # [[ 0 2] # [ 8 10]] # 混合使用选择所有行第1和第3列 print(arr2d[:, [1, 3]]) # [[ 1 3] # [ 5 7] # [ 9 11] # [13 15]]三、高级切片技巧1. 负索引与步长组合arr np.arange(20).reshape(4, 5) # 负索引从末尾开始计数 print(arr[-2:, -3:]) # 选取最后2行的最后3列 # 负步长实现反向选择 print(arr[::-1, ::-1]) # 完全反转数组2. Newaxis扩展维度arr np.array([1, 2, 3]) # 将一维转为二维 print(arr[:, np.newaxis]) # [[1], [2], [3]] print(arr[np.newaxis, :]) # [[1, 2, 3]]3. 省略号...的智能匹配arr3d np.random.rand(3, 4, 5) # 省略号自动展开剩余维度 print(arr3d[1, ...]) # 等价于 arr3d[1, :, :] print(arr3d[..., 2]) # 等价于 arr3d[:, :, 2]四、视图机制与内存效率这是NumPy切片的精髓original np.arange(10) slice_arr original[2:7] # 修改切片会影响原数组 slice_arr[0] 99 print(original) # [ 0 1 99 3 4 5 6 7 8 9] # 获取真正副本 copy_arr original[2:7].copy() copy_arr[0] 88 print(original) # [ 0 1 99 3 4 5 6 7 8 9] 不受影响视图机制的优势内存效率不复制数据只维护视图指针速度快操作视图直接作用于原数组内存大数据友好处理大型数组时避免内存溢出五、高级应用场景1. 切片作为函数参数def process_batch(data, batch_size32): 按批处理数据 for i in range(0, len(data), batch_size): batch data[i:ibatch_size] # 处理批次数据...2. 切片配合条件索引data np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 选择每行大于3的元素 mask data 3 print(data[mask]) # [4 5 6 7 8 9]3. 维度重塑与切片arr np.arange(24) reshaped arr.reshape(2, 3, 4) # 选择特定维度组合 print(reshaped[0, :, :2]) # 第一块的所有行前两列 print(reshaped[:, 1, 3]) # 所有块的中间行最后一列六、常见陷阱与解决方案维度丢失问题arr np.array([[1, 2, 3]]) print(arr[0]) # [1 2 3] 降维了 print(arr[0:1]) # [[1 2 3]] 保持维度广播规则冲突a np.ones((3, 4)) b np.zeros(4) result a b # 自动广播 # 但切片操作需要显式对齐维度 result a b[np.newaxis, :]NumPy切片的核心在于多维坐标系的精确定位与内存视图机制的高效运用。掌握这些概念后你就拥有了对数组数据的 surgical knife手术刀级控制力。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2443556.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!