关于NumPy数组布尔索引后列选取操作的疑问
NumPy布尔索引与数组切片的原理解释
首先修正代码中的笔误:原语句里的names = "Bob"是赋值操作,会导致语法错误,正确的布尔索引写法应该是names == "Bob",以下基于正确写法展开解释。
先回顾基础代码:
import numpy as np names = np.array(["Bob", "Joe", "Will", "Bob", "Will", "Joe", "Joe"]) data = np.array([[4, 7], [0, 2], [-5, 6], [0, 0], [1, 2], [-12, -4], [3, 4]])
第二条语句:data[names == "Bob", 1:]
- 第一步:
names == "Bob"生成布尔数组array([True, False, False, True, False, False, False]),这个数组对应names中每个位置是否为"Bob",用来筛选data里对应位置的行。 - 第二步:逗号后的
1:是列切片语法,表示取从索引1开始的所有列(data的列索引从0开始,索引1对应第二列)。 - 最终效果:先筛选出"Bob"对应的两行数据
[[4,7], [0,0]],再提取这些行的第二列。因为切片操作1:会保留原数组的二维结构,所以返回结果是二维数组array([[7], [0]])。
第三条语句:data[names == "Bob", 1]
- 第一步:布尔索引部分和第二条完全一致,同样筛选出"Bob"对应的两行数据。
- 第二步:逗号后的
1是单个列索引,直接定位到第二列的元素。 - 最终效果:NumPy提取单个列的元素时,会自动压缩维度,把原本的二维列向量转换为一维数组,所以返回结果是一维数组
array([7, 0])。
内容的提问来源于stack exchange,提问作者Daniel Nguyen
相关产品推荐
相关产品推荐

