这个切片是什么意思[:,:,0]?

cag*_*yKJ 1 python indexing numpy slice

我想了解这段代码

我无法理解这条线的作用.流变量是流向量的数组,其中图像中的每个像素都有一个(所以是2d数组).

fx, fy = flow[:, :, 0], flow[:, :, 1]

任何帮助,将不胜感激

Wil*_*sem 5

我们先简化一下表达式.你的代码:

fx, fy = flow[:, :, 0], flow[:, :, 1]
Run Code Online (Sandbox Code Playgroud)

相当于:

fx = flow[:, :, 0]
fy = flow[:, :, 1]
Run Code Online (Sandbox Code Playgroud)

所以现在它归结为什么flow[:, :, 0].这意味着它flow是一个至少有三个维度的numpy数组(让我们定义N为维数).然后flow[:,:,0]是一个N-1维数组,我们0总是选择第三维.

在的情况下的图像处理,图像通常是一个三维阵列(给定其具有颜色)与维度w× h× 3(三个颜色通道).所以这里意味着flow[:,:,0]将生成一个w× h 视图,对于每个像素,我们选择红色通道(给定红色通道是第一个通道).

所以如果flow是5×4×3矩阵,如:

>>> flow
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],
        [27, 28, 29],
        [30, 31, 32],
        [33, 34, 35]],

       [[36, 37, 38],
        [39, 40, 41],
        [42, 43, 44],
        [45, 46, 47]],

       [[48, 49, 50],
        [51, 52, 53],
        [54, 55, 56],
        [57, 58, 59]]])
Run Code Online (Sandbox Code Playgroud)

然后我们将为每个3元组获得第一个元素,使其成为:

>>> flow[:,:,0]
array([[ 0,  3,  6,  9],
       [12, 15, 18, 21],
       [24, 27, 30, 33],
       [36, 39, 42, 45],
       [48, 51, 54, 57]])
Run Code Online (Sandbox Code Playgroud)

通过查询flow[:,:,1],我们获得:

>>> flow[:,:,1]
array([[ 1,  4,  7, 10],
       [13, 16, 19, 22],
       [25, 28, 31, 34],
       [37, 40, 43, 46],
       [49, 52, 55, 58]])
Run Code Online (Sandbox Code Playgroud)

记住,这些观点:如果你改变flow,它都会对影响fxfy,即使你没有这些分配之前.