使用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[:]返回的是原数组的视图,而非独立副本。所有行添加的都是同一个数组对象的引用,打印表格时数组已经被更新到最终状态,因此所有行显示相同内容。
只需在添加行时传入数组的副本即可解决,修改方式有两种:
- 使用
gradJ.copy()创建副本 - 使用
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
相关产品推荐
相关产品推荐

