首页 > 解决方案 > 在 Python 中的这个数组切片中这个 'a' 的目的是什么( W[: , : , : , a] )?

问题描述

这是代码示例:

weights = W[:,:,:,a]

这里,a是一个整数

在数组切片中,我需要对 Python 的切片表示法有一个很好的解释(参考是​​一个加号)。我不明白这个'a'的目的是什么。我们知道 3D 数组就像一堆矩阵,其中:

标签: pythonarraysnumpy-slicing

解决方案


形状:

M成为您的n维数组:

参考图片:https ://fgnt.github.io/python_crashkurs_doc/_images/numpy_array_t.png

  1. M (x,)的形状意味着您的数组有x 行
  2. M (x, y)的形状意味着您的数组有x 行y 列
  3. M (x, y, z)的形状意味着您的数组有x 行y 列z“层”

如果您愿意,您可以将形状视为(线、...),但是当您谈论四维数组或更大时,事情会变得复杂(也许您可以将它们命名为第四维的块堆栈) .

无论如何,更好的命名约定如下:

M轴 0轴 1轴 2,...,轴 n)如参考图像所示。

要在 Python 中找到数组的形状,只需编写:M.shape

切片:

在数组索引中,逗号分隔数组的维度: M [轴 0 ,轴 1 ,轴 2 , ...,轴 n ] 对于每个轴,您可以具有以下切片结构:

[开始:停止:步骤]其中:

  1. start:所选轴的第一个索引(包含在结果中)
  • start = 0是默认的开始索引(不需要指定)
  1. stop:所选轴的最后一个索引(不包括在结果中)
  • stop = len(axis)是默认结束索引(不需要指定)
  1. step : 遍历选定轴的步骤:
  • step = 0是不允许的
  • step = 1为默认步长(不需要指定)
  • step = -1表示反向遍历
  • step = n表示从nn

以下切片是等效的: M [0:n+1:1]、M [:] 和M [::] 根据默认值。

混合在一起,现在我们可以写一个通用的切片符号:

M  [轴起始索引0 : 轴停止索引0 : 轴步进0 ,轴
     起始索引1 : 轴停止索引1 : 轴步进1 ,
     start-index-for-axis 2 : stop-index-for-axis 2 : step-for-axis 2 ,
     ...
     start-index-for-axis n : stop-index-for-axis n : step-对于轴n ] ,

足够的理论,让我们看一些例子

我们有M,一个二维数组,具有 (5, 5) 形状:

M = np.arange(1, 26).reshape(5, 5)
print(M)

结果:

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

print('Traverse the matrix from the last line to the first one (axis=0)', matrix[::-1],  sep='\n')

结果:

[[21 22 23 24 25]
[16 17 18 19 20]
[11 12 13 14 15]
[ 6  7  8  9 10]
[ 1  2  3  4  5]]

print('The 3 columns in the middle of the matrix (take all data from axis=0, and take a slice from axis=1):' , matrix[:, 1:4],sep='\n')

结果:

[[ 2  3  4]
[ 7  8  9]
[12 13 14]
[17 18 19]
[22 23 24]]

现在,您的切片:W [:, :, :, a ],其中 a是一个整数变量,可以解释为:

  • M是一个四维数组
  • 您从轴 0轴 1轴 2中获取所有内容
  • 你只取轴3的索引a

可以将四维数组想象为三维块的堆栈/数组,您的切片意味着:从每个块的每个矩阵中取出列,最后得到一个三维数组。


推荐阅读