布尔索引本身很快,慢常因条件构造、形状不匹配或意外拷贝;布尔数组长度必须与被索引轴一致,否则报IndexError;二维中布尔索引需与切片分步使用;多条件须用&而非and。

直接说结论:布尔索引本身很快,但慢往往出在条件构造、形状不匹配或意外拷贝上。关键不是“怎么写”,而是“怎么避免踩坑”。
布尔数组长度必须和被索引轴完全一致
这是最常报错的点:IndexError: boolean index did not match indexed array along axis 0。比如你有 names 长度为 5,score 行数为 4,执行 score[names == "Bob"] 就会崩。
- 检查手段:打印
len(names)和score.shape[0],二者必须相等 - 修复方式:要么对齐数据(删掉多余 name 或补全 score),要么显式切片,如
score[:len(names)][names == "Bob"] - 注意:布尔数组不能自动广播,
[True, False]无法用于长度为 6 的数组,哪怕你只想选前两个
二维数组中混合使用布尔索引和切片
想只取某人某几列的成绩?别写 score[names=="Bob", [1,2]]——这会触发花式索引,且列索引是整数列表,和布尔索引不兼容。
- 正确写法是:
score[names == "Bob"][:, [1,2]],先用布尔索引取出行,再用切片/整数索引取列 - 或者更安全:
score[names == "Bob"][:, 1:3],用切片避免维度爆炸 - 错误示范:
score[names == "Bob", 1:3]看似简洁,但 NumPy 会尝试把布尔数组和切片同时作用于前两维,容易因维度不匹配静默出错
多条件组合必须用 & 而不是 and
arr > 30 and arr 会直接抛 ValueError: The truth value of an array with more than one element is ambiguous,因为 Python 的 and 无法处理数组真值判断。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 永远用
&(位与)、|(位或)、~(位取反),且每个条件必须加括号:(arr > 30) & (arr -
&是逐元素逻辑与,and是标量短路运算,二者语义完全不同 - 如果条件来自变量,比如
mask1 = arr > 30,mask2 = arr ,那直接写arr[mask1 & mask2]即可
布尔索引返回的是拷贝,不是视图
这点容易被忽略:无论你筛选出多少个元素,arr[condition] 返回的新数组都是原数组的深拷贝,修改它不会影响原数组。
- 如果你需要原地修改,得用赋值语法:
arr[condition] = new_value - 想确认是否为视图?查
arr[condition].base is arr,结果一定是False - 性能提示:频繁布尔索引 + 大数组 → 内存占用明显上升,必要时用
np.where(condition)拿到整数索引再复用
真正卡住人的,往往不是“不会写布尔索引”,而是没意识到条件表达式本身会产生新数组、形状对齐是硬性要求、以及 & 和 and 的底层机制差异。写完记得 print 出布尔数组看看 shape 和 True 数量,比盲调快得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










