如何使以下打印语句的每个部分(历元,时间,损失等)占用一致的空间。当前,它们是不一致的,因为某些浮点值有时会占用5个空格或6个空格(例如10.345、2.123)。
print('Epoch: [{0}][{1}/{2}]\t'
'Time: {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
'Loss: {loss.val:.4f} ({loss.avg:.4f})\t'
'Prec@1: {top1.val:.3f}% ({top1.avg:.3f}%)\t'
'Prec@5: {top5.val:.3f}% ({top5.avg:.3f}%)'.format(
epoch, i, len(data_loader), batch_time=batch_time,
loss=losses, top1=top1, top5=top5))
示例:
Epoch: [4][90/1770] | Time: 0.315 (0.321) | Loss: 1.5111 (1.6552) | Prec@1: 72.266% (67.943%) | Prec@5: 84.375% (83.001%)
Epoch: [4][100/1770] | Time: 0.314 (0.320) | Loss: 1.6079 (1.6558) | Prec@1: 70.312% (67.965%) | Prec@5: 84.766% (82.990%)
如您所见,每个部分的间距不一致。预先添加的空格不起作用,因为要添加的空格数量必须根据值的长度(90/1770与100/1770)而不同。
我知道我可以以打印格式进行{:5.3f}
的操作,但是我的打印语句存在的问题是,有些是固定单词,如“ Epoch”,而有些则是变量,即值。我该如何处理这种情况?我需要使整个块而不只是值保持一致。
答案 0 :(得分:0)
您已经知道如何为浮点数添加宽度:
我了解我可以以打印格式进行{:5.3f}
您可以对整数或任何其他类型进行完全相同的操作。
print('Epoch: [{0:1}][{1:3}/{2:4}]\t'
'Time: {batch_time.val:5.3f} ({batch_time.avg:5.3f})\t'
# and so on
{1:3}
意味着90
将在其前面显示一个空格,如下所示:
Epoch: [4][ 90/1770] | Time: 0.315 (0.321) | Loss: 1.5111 (1.6552) | Prec@1: 72.266% (67.943%) | Prec@5: 84.375% (83.001%)
因此它将与下一行对齐:
Epoch: [4][100/1770] | Time: 0.314 (0.320) | Loss: 1.6079 (1.6558) | Prec@1: 70.312% (67.965%) | Prec@5: 84.766% (82.990%)
如果您还没有阅读Format Specification Mini-Language的文档,而只是在猜测如何更改在随机在线代码中找到的示例,希望他们可以按照您的意愿进行操作,请阅读文档。一切都很简单。
您还说:
我的打印语句的问题在于,有些是固定词,例如“ Epoch”。
首先,固定字符串似乎不是问题。
如果是这样,只需手动添加空格就可以使它们具有相同的宽度。
如果确实需要,可以将这些固定的字符串存储在变量中,并为其添加格式字段,因此您可以在某处添加宽度字段:
print('{epoch_label:6}: [{0:1}][{1:3}/{2:4}]\t'
'{time_label:6}: {batch_time.val:5.3f} ({batch_time.avg:5.3f})\t'
# etc.
loss=losses, top1=top1, top5=top5,
epoch_label='Epoch', time_label='Time'))
...但是这似乎很愚蠢。
答案 1 :(得分:0)
您也可以玩'center','rjust'和'ljust':
In [23]: for a,b,c,d in ( (4,90,1770,0.315), (4,100,1770,0.314)):
...: print("Epoch: "+f"[{a}][{b}/{c}]".center(15)+"| Time: "+f"{d:.3f}".center(8)+"|")
...:
Epoch: [4][90/1770] | Time: 0.315 |
Epoch: [4][100/1770] | Time: 0.314 |