为何Numpy切片与索引两种写法的结果存在差异?
为什么NumPy中两种索引方式结果不一致?
我尝试用两种方法从3x3x3的NumPy数组中提取部分数据,但结果不一样,代码如下:
import numpy as np # Create a 3x3x3 cube cubote = np.arange(27).reshape(3,3,3) # Compare the results result1 = cubote[0:2,0:2,0:2] result2 = cubote[0:2][0:2][0:2] print(result1) print("Shape of result1:", result1.shape) print(result2) print("Shape of result2:", result2.shape)
输出结果:
result1:
[[[ 0 1] [ 3 4]] [[ 9 10] [12 13]]] Shape of result1: (2, 2, 2)
result2:
[[[ 0 1 2] [ 3 4 5] [ 6 7 8]] [[ 9 10 11] [12 13 14] [15 16 17]]] Shape of result2: (2, 3, 3)
我原本预期两种方法结果一致,result1符合预期,但result2不是我想要的,请问这是为什么?
原因解析
这两种索引方式的本质逻辑完全不同:
逗号分隔的多维切片(
cubote[0:2,0:2,0:2]):
这种写法是一次性在所有维度上指定切片范围,分别对数组的第一、第二、第三个维度取前2个元素,相当于从3x3x3的立方体里精准切出一个2x2x2的子立方体,这就是你预期的结果。链式索引(
cubote[0:2][0:2][0:2]):
这种写法是三次独立的顺序索引操作,每一次[]都是对当前得到的数组的第一个维度进行切片:- 第一次
cubote[0:2]:从原数组的第一个维度(最外层)取前2个元素,得到形状为(2,3,3)的数组(包含两个完整的3x3二维数组); - 第二次
[0:2]:对这个(2,3,3)的数组,再次取其第一个维度的前2个元素——但这个数组的第一个维度本来就只有2个元素,所以结果还是(2,3,3); - 第三次
[0:2]:重复第二次的操作,结果依然是(2,3,3)的数组,自然和result1的形状、内容都不一样。
- 第一次
简单来说,链式索引每次只操作当前数组的第一个维度,而逗号分隔的切片可以同时操作多个维度,这就是两者结果差异的核心原因。
内容的提问来源于stack exchange,提问作者Hamilton Espitia
相关产品推荐
相关产品推荐

