我有一个 nd-array A
A.shape
(2, 500, 3)
A[:]
和A[:,2]
有什么区别
来自 Python,数组访问中的","让我感到非常困惑。
逗号分隔每个维度的下标。因此,例如,如果矩阵M
定义为
M = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
那么M[2, 1]
将是 8(第三行,第二列)。
每个维度的下标也可以是一个切片,其中:
表示一个完整的切片,就像普通 Python 序列中的切片一样。 例如,M[:, 2]
将从每一行中选择第三列,这将是[3, 6, 9]
。
未提供下标的任何其他维度都是隐式完整切片。 在您的示例中,A[:,2]
等效于A[:, 2, :]
。如果您认为(2, 500, 3)
形数组是两个具有 500 行和 3 列的堆叠矩阵,那么A[:, 2, :]
将从两个矩阵中选择第三行(以及第三行的每一列),其形状应为(2, 3)
。
当您具有多维 NumPy 数组时,如果您提供slice()
对象的元组,切片操作[]
可以工作。如果元组数与您的维数不匹配,则等效于在所有剩余维度中都有一个slice(None)
(缩写为:
)。另请注意,NumPy 也接受...
,这意味着"用:
填充其余维度"——如果您想"填充"初始维度,这尤其有用。
因此,概括一下以下表达式,在A
数组上给出相同的结果A.ndim == 3
:
A[:, 2]
A[:, 2, :]
A[:, 2, ...]
A[slice(None), 2]
A[slice(None), 2, slice(None)]
A[(slice(None), 2) + tuple(slice(None) for _ in range(A.ndim - 2))]