我有一个nd-array A
A.shape
(2, 500, 3)
A[:]
和A[:,2]
来自Python,数组访问中的','让我很困惑。
答案 0 :(得分:3)
逗号分隔每个维度的下标。因此,例如,如果矩阵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)
。
答案 1 :(得分:1)
当您拥有多维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))]