为了详细展示代码中取数的过程,我们先回顾一下代码,然后逐步分析每一步的取数逻辑。以下是代码示例:
import numpy as np
x = np.arange(24).reshape((2, 3, 4))
for i in range(x.shape[1]):
print(x[:, i, :])
1. 创建三维数组 x
x = np.arange(24).reshape((2, 3, 4))
np.arange(24)
会生成一个包含从 0 到 23 的一维数组:[0, 1, 2, ..., 23]
。reshape((2, 3, 4))
会将这个一维数组重新组织成一个三维数组,这个三维数组可以想象成是由 2 个“页”组成,每个“页”是一个 3 行 4 列的二维数组。具体来说,这个三维数组x
的样子如下:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
2. 遍历循环
for i in range(x.shape[1]):
x.shape
返回数组在每个维度上的大小,这里x.shape
是(2, 3, 4)
。x.shape[1]
表示数组在第 1 个维度(从 0 开始计数)上的大小,即 3。range(x.shape[1])
会生成一个包含 0、1、2 的序列,所以循环会执行 3 次,i
依次取值 0、1、2。
3. 取数并打印
print(x[:, i, :])
:
是切片操作符,表示选取该维度上的所有元素。- 下面详细分析每次循环的取数过程:
第一次循环,i = 0
x[:, 0, :]
表示在第 0 个维度上选取所有元素(即 2 个“页”都要),在第 1 个维度上选取索引为 0 的元素(即每个“页”的第 1 行),在第 2 个维度上选取所有元素(即每行的所有列)。- 具体取数为:
-
- 第一“页”的第 1 行:
[0, 1, 2, 3]
- 第二“页”的第 1 行:
[12, 13, 14, 15]
- 第一“页”的第 1 行:
- 最终得到的结果是一个 2 行 4 列的二维数组:
array([[ 0, 1, 2, 3],
[12, 13, 14, 15]])
第二次循环,i = 1
x[:, 1, :]
表示在第 0 个维度上选取所有元素(2 个“页”),在第 1 个维度上选取索引为 1 的元素(每个“页”的第 2 行),在第 2 个维度上选取所有元素(每行的所有列)。- 具体取数为:
-
- 第一“页”的第 2 行:
[4, 5, 6, 7]
- 第二“页”的第 2 行:
[16, 17, 18, 19]
- 第一“页”的第 2 行:
- 最终得到的结果是:
array([[ 4, 5, 6, 7],
[16, 17, 18, 19]])
第三次循环,i = 2
x[:, 2, :]
表示在第 0 个维度上选取所有元素(2 个“页”),在第 1 个维度上选取索引为 2 的元素(每个“页”的第 3 行),在第 2 个维度上选取所有元素(每行的所有列)。- 具体取数为:
-
- 第一“页”的第 3 行:
[8, 9, 10, 11]
- 第二“页”的第 3 行:
[20, 21, 22, 23]
- 第一“页”的第 3 行:
- 最终得到的结果是:
array([[ 8, 9, 10, 11],
[20, 21, 22, 23]])
综上所述,这段代码通过循环和切片操作,依次取出了三维数组 x
在第 1 个维度上的每个“截面”,并将其打印输出。