NumPy切片默认返回视图而非拷贝,但负步长需start>end,省略规则如arr[:3]等价于arr[0:3];布尔索引返回拷贝且需长度匹配;花式索引总返回拷贝并可能改变维度顺序;np.take/np.compress更安全可控。

用 arr[start:end:step] 做基础切片,但别忽略负索引和省略规则
NumPy 切片本质是视图(view),不是拷贝,这点直接影响内存和后续修改行为。直接写 arr[1:4] 会取索引 1、2、3 的元素(左闭右开),arr[::-1] 可逆序——但要注意:负步长时 start 必须大于 end,否则返回空数组。省略写法很常用:arr[:3] 等价于 arr[0:3],arr[2:] 从索引 2 到末尾,arr[::2] 取偶数索引位置。
容易踩的坑:
- 对二维数组只写一个切片(如
arr[1:3])只作用于第 0 轴,等价于arr[1:3, :],不是“取前两行前两列” -
arr[-1:-3:-1]是合法的(取倒数第一、第二个元素),但arr[-1:-3]返回空,因为默认 step=1 时无法从 -1 到 -3 - 切片结果仍是
ndarray,但维度可能降级(如arr[0]得到一维数组,不是标量)
用布尔索引提取不规则子集,比 np.where 更直观
当你需要“所有大于 5 的元素”或“满足多个条件的行”,布尔索引比循环或 np.where 更简洁高效。直接传入布尔数组(长度必须匹配对应轴):arr[arr > 5] 返回一维结果;二维下 arr[arr[:, 0] > 0] 提取第 0 列为正的所有行。
关键点:
立即学习“Python免费学习笔记(深入)”;
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
- 布尔数组必须与被切数组在对应维度上长度一致,否则报错
IndexError: boolean index did not match indexed array - 多条件用
&(不是and)、|(不是or)、~(不是not),因为这是逐元素运算 - 布尔索引返回的是拷贝(copy),不是视图,原数组修改不影响结果
- 如果想保留原始形状(比如只屏蔽某些值),用
np.where(condition, arr, np.nan)更合适
用花式索引(fancy indexing)按指定位置取离散元素
当你要取第 0、2、5 行,或第 1、3、7 列,就得用整数数组索引,也就是花式索引:arr[[0, 2, 5]] 或 arr[:, [1, 3, 7]]。它总是返回拷贝,且会**改变维度顺序**:若对行用 [2, 0, 1],结果行顺序就按这个重排。
常见陷阱:
- 传入列表或元组都行,但不能传普通 Python 整数混合(如
arr[[0, 1], 2]合法,arr[[0, 1], [2]]也合法;但arr[[0, 1], 2:4]会报错,混合花式索引和切片需谨慎) - 二维下
arr[[0, 2], [1, 3]]是“取 (0,1) 和 (2,3) 两个点”,不是笛卡尔积;要取所有组合得用np.ix_ - 索引数组里有重复值(如
[0, 0, 1])会导致结果中对应行也重复,这有时是故意为之,但容易误以为是 bug
用 np.take 和 np.compress 替代手写索引,尤其适合高维或动态场景
当索引逻辑复杂或来自变量时,np.take(arr, indices, axis=1) 比 arr[:, indices] 更安全——它自动处理 indices 超出范围的情况(默认抛异常,可设 mode='wrap' 或 'clip')。而 np.compress(condition, arr, axis=0) 是布尔索引的函数式等价物,好处是 axis 明确可控,且能嵌套调用。
适用场景:
- 从配置读取列号列表,再批量提取:
np.take(arr, col_ids, axis=1)比arr[:, col_ids]更容错 - 在函数中封装子集逻辑,避免用户传错维度:
np.compress(mask, arr, axis=0)明确限定作用轴 -
np.take支持out参数预分配输出数组,对性能敏感路径有用 - 注意:
np.take不支持负步长切片,也不支持布尔数组,别试图用它替代arr[arr > 0]
最常被忽略的一点:切片是否返回视图,取决于操作类型和数组内存布局。哪怕你只用 :,如果原数组是非 C 连续(比如转置后未复制),切片也可能被迫返回拷贝。用 arr.flags.c_contiguous 和 np.may_share_memory(arr, subset) 实际验证,别只靠经验猜。

















