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

如何修改Numpy数组指定元素字体颜色并解决输出对齐问题

对齐错位的核心原因
  • 终端识别的ANSI颜色转义符(比如\033[31m、\033[0m)是不会显示的控制字符,但Python计算字符串长度时会把这些字符算入长度,直接拼接后做对齐会出现宽度计算偏差。
  • 原实现没有统一每个元素的占位宽度,不同长度的数值直接用单空格拼接,自然无法复现numpy原生的等宽对齐效果。
修复方法1:调整原有代码逻辑

核心思路是先复用numpy原生的数值字符串格式,单独计算每列的显示宽度,把颜色转义码放在宽度控制逻辑的外层,不让转义符参与宽度计算,代码如下:

import numpy as np

a = np.array([[0,0,0],
              [0,0,0],
              [23.7135132,0,0],
              [32.22954112,0,0],
              [71.01941585,31.27384681,0]])

def trans(a, j, *lst):
    num_row, num_col = a.shape
    # 提取numpy原生打印的元素字符串,保证数值格式和原生一致
    raw_str = np.array2string(a, separator=' ').replace('[','').replace(']','').split()
    str_mat = np.array(raw_str, dtype=object).reshape(num_row, num_col)
    # 计算每列最大宽度,作为对齐的基准
    col_widths = [max(len(str_mat[r,c]) for r in range(num_row)) for c in range(num_col)]
    highlight_pos = set((x[0], x[1]) for x in lst)
    row_res = []
    for m in range(num_row):
        cell_list = []
        for n in range(num_col):
            val = str_mat[m,n]
            if (m,n) in highlight_pos:
                # 颜色码放在格式化占位外,宽度计算只统计实际显示的数值长度
                cell = f"\033[3{j}m{val:<{col_widths[n]}}\033[0m"
            else:
                cell = f"{val:<{col_widths[n]}}"
            cell_list.append(cell)
        row_res.append(' '.join(cell_list))
    return '\n'.join(row_res)

print(trans(a, 1, [0,1], [1,2], [2,0]))
修复方法2:复用numpy原生排版逻辑(更推荐)

不用自己手动计算宽度、处理拼接,直接把带颜色标记的元素存为object类型数组,交给numpy原生打印模块自动处理对齐、精度、换行,代码更简洁,效果和原生numpy输出完全一致:

import numpy as np

a = np.array([[0,0,0],
              [0,0,0],
              [23.7135132,0,0],
              [32.22954112,0,0],
              [71.01941585,31.27384681,0]])

def highlight_arr(arr, color_id, *positions):
    pos_set = set(positions)
    fmt_arr = np.empty(arr.shape, dtype=object)
    # 给需要高亮的元素套上颜色转义码
    for idx, val in np.ndenumerate(arr):
        val_str = str(val)
        if idx in pos_set:
            fmt_arr[idx] = f"\033[3{color_id}m{val_str}\033[0m"
        else:
            fmt_arr[idx] = val_str
    # 调用numpy原生打印,设置足够行宽避免自动换行
    with np.printoptions(linewidth=200):
        print(fmt_arr)

highlight_arr(a, 1, [0,1], [1,2], [2,0])

补充说明

  • 颜色编号可选值:1为红色、2为绿色、3为黄色、4为蓝色、5为紫色、6为青色、7为白色,可根据终端配色自行选择。
  • 如果需要更醒目的背景高亮,把转义码开头的3改成4即可,比如\033[41m就是红色背景。

内容的提问来源于stack exchange,提问作者LittleTiger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:54:18