You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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]):
    这种写法是三次独立的顺序索引操作,每一次[]都是对当前得到的数组的第一个维度进行切片:

    1. 第一次cubote[0:2]:从原数组的第一个维度(最外层)取前2个元素,得到形状为(2,3,3)的数组(包含两个完整的3x3二维数组);
    2. 第二次[0:2]:对这个(2,3,3)的数组,再次取其第一个维度的前2个元素——但这个数组的第一个维度本来就只有2个元素,所以结果还是(2,3,3);
    3. 第三次[0:2]:重复第二次的操作,结果依然是(2,3,3)的数组,自然和result1的形状、内容都不一样。

简单来说,链式索引每次只操作当前数组的第一个维度,而逗号分隔的切片可以同时操作多个维度,这就是两者结果差异的核心原因。


内容的提问来源于stack exchange,提问作者Hamilton Espitia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:50:57