如何修改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
相关产品推荐
相关产品推荐

