假设arr_2d
被声明为 numpy 数组:
import numpy as np
arr_2d = np.array([[5, 10, 15],
[20, 25, 30],
[35, 40, 45]])
然后,arr_2d[1:3, 1:3]
将从每个维度返回具有元素 1 和 2 的子矩阵(注意 Python 从 0 开始索引)。
arr_2d[1:3][1:3]
被解释为索引两次:
首先arr_2d[1:3]
需要第 1 行和第 2 行:rows_1_2 = np.array([[20, 25, 30], [35, 40, 45]])
然后,该结果再次用 索引[1:3]
,因此rows_1_2[1:3]
将给出 的第 1 行和第 2 行rows_1_2
。由于该数组中不存在第 2 行,因此仅返回第 1 行,因此[[35, 40, 45]]
. 请注意,这是一个 1x3 数组。
一般来说,强烈建议使用'slice indexing',因为索引 2 次对于大型数组来说可能会不必要地变慢。
请注意,对于标准 Python 列表,要获得类似的子矩阵,您需要将其编写为:
list_2d = ([[5, 10, 15],
[20, 25, 30],
[35, 40, 45]])
[row[1:3] for row in list_2d[1:3]] # result: [[25, 30], [40, 45]]
对于大型列表,这既难读又慢得多。但请注意,标准 Python 可以处理不同类型和长度的子列表,而 numpy 需要相同大小和类型的所有内容。
切片和广播使带有 numpy 的 Python 非常适合数字操作和计算。