Numpy中list与ndarray作为fancy indexing参数结果差异原因问询
Numpy 嵌套列表与ndarray作为fancy索引的差异原理
索引解析规则的本质差异
Numpy对Python原生列表和ndarray作为索引对象时,采用完全不同的解析逻辑,这是报错的核心原因:
1. 原生嵌套列表作为索引的解析逻辑
当你向[]运算符传入Python原生列表时,Numpy会把列表的每一层嵌套对应数组的一个维度索引:
- 你使用的数组
a是1维结构,仅支持接收1个维度的索引参数 - 你传入的
b = [[3,1],[1,2]]是2层嵌套列表,Numpy会判定你要分别给数组的第1维、第2维传递索引,而a不存在第二维,因此直接抛出too many indices for array的报错。
举个反例方便理解:如果a是2维数组,a = np.arange(12).reshape(3,4),此时传入a[[0,2],[1,3]]是合法的,2层列表刚好匹配2维数组的行、列索引需求,会返回[a[0,1], a[2,3]]的结果。
补充:如果是一维原生列表作为索引,比如a[[1,3]],不会触发报错,因为只有1层嵌套,刚好匹配1维数组的索引要求,会被识别为单维度的fancy索引
2. ndarray作为索引的解析逻辑
当你把b转换为ndarray后,Numpy会把整个ndarray当成单个维度的索引集合,不管这个ndarray本身是多少维度,都会将其内部的每个元素作为当前维度的索引取值,最终返回和索引ndarray形状完全一致的结果:
- 你转换后的
b是shape为(2,2)的ndarray,作为1维数组a的索引时,Numpy会依次取出b中的每个整数作为位置索引去a中取值,最后把结果拼接为(2,2)的数组,因此可以正常运行得到你看到的结果。
内容的提问来源于stack exchange,提问作者liqiochi
相关产品推荐
相关产品推荐

