在numpy ndarrays切片中跳过行

时间:2018-01-13 07:54:43

标签: python numpy multidimensional-array

假设我有一个numpy数组imgimg.shape == (468,832,3)img[::2, ::2]做了什么?它将形状缩小为(234,416,3)你能解释一下逻辑吗?

3 个答案:

答案 0 :(得分:2)

让我们一起阅读文档(Source).  (先阅读粗体部分)

  

基本切片语法是 i:j:k ,其中 i 起始索引 j 停止索引 k 步骤(k \ neq 0)。这将选择m个元素(在相应的维度中),其中索引值为i,i + k ,...,i +(m - 1) k 其中m = q +(r \ neq0)和q和r是通过将j-i除以k得到的商和余数:j-i = qk + r,使得i +(m-1)k <1。学家

     

...

     

假设 n 是要切片的维度中的元素数。   然后,如果没有给出,则默认为0,对于k&gt; 0 和n - 1表示k <0。 0   。 如果没有给出j,则k> 0时默认为n; 0 和-n-1表示k < 0。如果   k没有给出它默认为1.注意::与:和。相同   表示沿此轴选择所有索引。

现在看着你的角色。

[::2, ::2]将被翻译为[0:468:2, 0:832:2],因为您未在文档中指定前两个或ij。 (这里只指定k。回想上面的i:j:k符号。)在步长2上选择这些轴上的元素,这意味着您沿指定的轴选择所有其他元素。

因为您没有为第三维指定,所以将全部选中。

答案 1 :(得分:1)

它从数组中切换每个备用行,然后是每个备用列,返回一个大小为(n // 2, n // 2, ...)的数组。

以下是使用2D数组切片的示例 -

>>> a = np.arange(16).reshape(4, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

>>> a[::2, ::2]
array([[ 0,  2],
       [ 8, 10]])

而且,这是3D阵列的另一个例子 -

>>> a = np.arange(27).reshape(3, 3, 3)
>>> a
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],
        [24, 25, 26]]])

>>> a[::2, ::2] # same as a[::2, ::2, :]
array([[[ 0,  1,  2],
        [ 6,  7,  8]],

       [[18, 19, 20],
        [24, 25, 26]]])

答案 2 :(得分:1)

好吧,我们将RGB图像作为3D形状阵列:

img.shape=(468,832,3)

现在,img[::2, ::2]做了什么?

我们只是对图像进行下采样(即我们通过从原始图像中仅 每隔一个像素缩小图像尺寸,我们通过使用步长2,这意味着跳过一个像素)。从下面的例子中可以清楚地看出这一点。

让我们拍摄一张简单的灰度图像,以便于理解。

In [13]: arr
Out[13]: 
array([[10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55],
       [60, 61, 62, 63, 64, 65]])

In [14]: arr.shape
Out[14]: (6, 6)

In [15]: arr[::2, ::2]
Out[15]: 
array([[10, 12, 14],
       [30, 32, 34],
       [50, 52, 54]])

In [16]: arr[::2, ::2].shape
Out[16]: (3, 3)

请注意哪些像素位于切片版本中。另外,观察切片后数组shape如何变化(即减半)。

现在,对于图像中的所有三个通道都会发生这种下采样,因为在第三个轴上没有发生切片。因此,您将仅为示例中的前两个轴减小形状。

(468, 832, 3)
  .    .   |
  .    .   |
(234, 416, 3)