繁体   English   中英

跳过numpy ndarrays切片中的行

[英]Skipping rows in numpy ndarrays slicing

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

它从数组中切出每个备用行,然后切成每个备用列,返回一个大小为(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]]])

让我们一起阅读文档(源代码)。 (只需先阅读粗体部分)

基本切片语法为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 = qk + r,因此i +(m-1)k <j。

...

假设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]因为您没有在文档中指定前两个或ij (您仅在此处指定k 。请回忆上面的i:j:k表示法。)您以步长2选择这些轴上的元素,这意味着您沿指定的轴选择了所有其他元素。

由于您未指定第3维,因此将全部选中。

好吧,我们将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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM