NumPy布尔索引疑问:为何未触发索引错误?
NumPy布尔索引疑问:为何未触发索引错误?
嘿,这个问题问得特别好!我刚上手NumPy布尔索引的时候也犯过类似的理解偏差,咱们一步步把它掰明白:
首先先明确两个核心形状:
- 你的原数组
x是(2, 3, 5)的三维数组,可以简单理解成「2个大模块,每个模块里有3个行,每行5个元素」; - 你用的布尔索引
[[True, True, False], [False, True, True]]是(2, 3)的二维数组,刚好和x的前两个维度(2个模块×3个行)完全对应!
这就是没触发索引错误的关键——NumPy的布尔索引规则里,当你用一个多维布尔数组去索引时,只要布尔数组的维度和原数组的前k个维度(k是布尔数组的维度数)形状匹配,就会把它当成逐位置的掩码来用,而不是只针对某一个轴单独索引。
具体到你的例子,NumPy会逐个检查布尔数组里的每个(i,j)位置:
- 当布尔值为
True时,就把x中对应x[i,j]的那个子数组(也就是长度为5的一维数组)提取出来; - 为
False的位置就直接跳过。
数一下你布尔数组里的True位置:(0,0)、(0,1)、(1,1)、(1,2),一共4个,所以最终会把这4个对应的子数组堆叠在一起,就得到了你看到的(4,5)形状的结果。
举个反例:如果你的布尔数组形状和原数组前k个维度不匹配(比如用一个(3,2)的布尔数组),那NumPy才会抛出索引错误,因为它找不到对应的位置掩码了。
备注:内容来源于stack exchange,提问作者Harmanpreet Singh
相关产品推荐
相关产品推荐

