Numpy Basics - 如何在数组访问中解释[:,]

时间:2017-09-28 15:57:49

标签: python arrays numpy

我有一个nd-array A

A.shape

(2, 500, 3)

A[:]A[:,2]

之间有什么区别

来自Python,数组访问中的','让我很困惑。

2 个答案:

答案 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))]