You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PrettyTable时GradJ列无法逐行部分更新的问题求助

问题:PrettyTable中Numpy数组无法逐行显示中间状态

使用PrettyTable构建表格时,希望gradJ数组像变量i一样逐行展示部分更新的状态,但运行代码后所有行的GradJ均显示为最终的完整数组。

期望输出

+---+---------------------+
  | i |        GradJ        |
  +---+---------------------+
  | 0 | [1. 0. 0. 0. 0. 0.] |
  | 1 | [1. 2. 0. 0. 0. 0.] |
  | 2 | [1. 2. 3. 0. 0. 0.] |
  | 3 | [1. 2. 3. 4. 0. 0.] |
  | 4 | [1. 2. 3. 4. 5. 0.] |
  | 5 | [1. 2. 3. 4. 5. 6.] |
  +---+---------------------+

实际输出

+---+---------------------+
  | i |        GradJ        |
  +---+---------------------+
  | 0 | [1. 2. 3. 4. 5. 6.] |
  | 1 | [1. 2. 3. 4. 5. 6.] |
  | 2 | [1. 2. 3. 4. 5. 6.] |
  | 3 | [1. 2. 3. 4. 5. 6.] |
  | 4 | [1. 2. 3. 4. 5. 6.] |
  | 5 | [1. 2. 3. 4. 5. 6.] |
  +---+---------------------+

问题代码

from prettytable import PrettyTable
import numpy

myTable = PrettyTable(["i", "GradJ"])
gradJ = numpy.zeros(6)
for i in range(6):
    gradJ[i] = i+1
    myTable.add_row([i, gradJ[:]])
print(myTable)

解决方案

问题根源是Numpy的切片gradJ[:]返回的是原数组的视图,而非独立副本。所有行添加的都是同一个数组对象的引用,打印表格时数组已经被更新到最终状态,因此所有行显示相同内容。

只需在添加行时传入数组的副本即可解决,修改方式有两种:

  1. 使用gradJ.copy()创建副本
  2. 使用numpy.copy(gradJ)创建副本

修改后的代码:

from prettytable import PrettyTable
import numpy

myTable = PrettyTable(["i", "GradJ"])
gradJ = numpy.zeros(6)
for i in range(6):
    gradJ[i] = i+1
    myTable.add_row([i, gradJ.copy()])  # 传入数组副本
print(myTable)

运行修改后的代码,即可得到逐行展示gradJ中间状态的表格。

内容的提问来源于stack exchange,提问作者DANILO RODRIGUES DE SOUZA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:00:01