2301_76263838 2023-03-26 11:34 采纳率: 100%
浏览 10
已结题

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

  • 写回答

1条回答 默认 最新

  • H3T 2023-03-26 13:20
    关注

    根据测试用例,可以看出 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] 的赋值方式。
     
    如果答案对您有所帮助,望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 3月26日

悬赏问题

  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应