a[k][i][j] = b[k][m][n] 和 a[k][i,j] = b[k][m][n]两种赋值方式异同

我在编写池化层代码时,对比了使用a[k][i][j] = b[k][m][n] 和 a[k][i,j] = b[k][m][n]两种赋值方式。我发现,使用测试代码时,其结果是一样的。
(测试发现是否去除.copy()对结果没有影响)

img

以下是测试用例,输出结果正常

img

然而,实际使用时发现,a[k][i][j] = b[k][m][n]的形式赋值会异常(IndexError: index 1 is out of bounds for axis 0 with size 1),而使用a[k][i,j] = b[k][m][n]则正常。可以确保a和b本身的形状是匹配的(a.shape=12,8,8;b.shape=12,4,4),而且打印出来发现a[k][i,j],a[k][i][j],b[k][m][n]都是一个浮点数。

请问这是怎么回事?

img

根据测试用例,可以看出 Maxpooling 类的 forward 和 backward 方法都是需要使用 a[k][i][j] 和 b[k][m][n] 的形式进行赋值的。因此,使用 a[k][i,j] = b[k][m][n] 的赋值方式会导致错误。
出现这种错误的原因可能是因为在 Maxpooling 类的 forward 和 backward 方法中,a 和 b 的数据类型是 numpy.ndarray,而 a[k][i,j] 这种形式的赋值方式其实是在调用 numpy.ndarray 的 getitem 方法,返回的是一个包含单个元素的 numpy.ndarray,而不是一个浮点数。因此,在使用 a[k][i,j] = b[k][m][n] 进行赋值时,左边的 a[k][i,j] 实际上是一个形状为 (1,) 的 numpy.ndarray,而右边的 b[k][m][n] 是一个浮点数,导致了赋值失败。
相比之下,使用 a[k][i][j] = b[k][m][n] 的赋值方式可以直接将右边的浮点数赋值给左边的元素,避免了上述问题。
因此,建议在 Maxpooling 类的 forward 和 backward 方法中使用 a[k][i][j] = b[k][m][n] 的赋值方式。
 
如果答案对您有所帮助,望采纳。