Python 在numpy Ndarays切片中跳过行

Python 在numpy Ndarays切片中跳过行,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,假设我有一个numpy数组img,其中img.shape==(468832,3)。img[::2,::2]做什么?它将形状简化为(234416,3)您能解释一下逻辑吗?它从一个数组中分割每一个备用行,然后是每一个备用列,返回一个大小为(n//2,n//2,…)的数组。 下面是一个使用二维阵列进行切片的示例- >>> a = np.arange(16).reshape(4, 4) >>> a array([[ 0, 1, 2, 3], [ 4

假设我有一个numpy数组
img
,其中
img.shape==(468832,3)
img[::2,::2]
做什么?它将形状简化为
(234416,3)
您能解释一下逻辑吗?

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

下面是一个使用二维阵列进行切片的示例-

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

这是另一个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]]])


它对数组中的每一个备用行,然后是每一个备用列进行切片,返回一个大小为
(n//2,n//2,…)
的数组

下面是一个使用二维阵列进行切片的示例-

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

这是另一个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]]])


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

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

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

现在看看你的角色

[::2,::2]
将转换为
[0:468:2,0:832:2]
,因为您没有在文档中指定前两个或
i
j
。(此处仅指定
k
。回想上面的
i:j:k
符号。)以步长2选择这些轴上的元素,这意味着沿指定轴每隔选择一个元素


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

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

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

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

现在看看你的角色

[::2,::2]
将转换为
[0:468:2,0:832:2]
,因为您没有在文档中指定前两个或
i
j
。(此处仅指定
k
。回想上面的
i:j:k
符号。)以步长2选择这些轴上的元素,这意味着沿指定轴每隔选择一个元素


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

好的,我们将RGB图像作为形状的三维阵列:

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)
请注意切片版本中的像素。另外,观察切片后阵列
形状
的变化(即减少一半)

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

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

我们将RGB图像作为三维形状阵列:

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)
请注意切片版本中的像素。另外,观察切片后阵列
形状
的变化(即减少一半)

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

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

你能解释一下
[::2,::2]
是如何切片3d数组语言(noob语言)的交替行和列的吗?@VaishnavMK另一个例子应该更清楚。这不是你解释的,而是你理解的。您正在指定沿其切片的“轴”。您能否解释一下
[::2,::2]
如何切片3d数组语言(noob语言)的交替行和列?@VaishnavMK另一个例子应该更清楚。这不是什么