如何实现Numpy矩阵的横向控制台打印功能
如何实现Numpy矩阵的横向控制台打印功能
我明白你的需求啦——想把多个Numpy数组和运算符横向对齐打印,让它们看起来像一行行的数学表达式,而不是各自占一整块。这个功能确实很实用,尤其是展示矩阵运算的时候。
下面我来给你实现这个niceprint函数,完全符合你给出的例子效果:
import numpy as np def niceprint(*args, op_width=7, eq_width=5): # 先处理所有输入参数,转换成每行的字符串列表 line_lists = [] n_rows = None for arg in args: if isinstance(arg, np.ndarray): # 将数组转换为字符串并按行拆分 arr_str = np.array2string(arg, separator=' ') # 拆分后去掉空行并去除每行首尾的空白 lines = [line.strip() for line in arr_str.split('\n') if line.strip()] # 确认所有数组的行数一致 if n_rows is None: n_rows = len(lines) else: if len(lines) != n_rows: raise ValueError("所有输入的矩阵必须拥有相同的行数") line_lists.append(lines) else: # 处理运算符字符串,只在垂直居中的行显示,其他行显示空格 if n_rows is None: raise ValueError("至少需要传入一个Numpy数组") middle_row = (n_rows - 1) // 2 op_lines = [] # 根据运算符类型选择宽度(*用op_width,=用eq_width,你可以自定义) current_width = eq_width if arg == '=' else op_width for i in range(n_rows): if i == middle_row: # 运算符居中显示 op_line = arg.center(current_width) else: op_line = ' ' * current_width line_lists.append(op_lines) # 拼接每行的所有部分并打印 for i in range(n_rows): current_line = ''.join([lines[i] for lines in line_lists]) print(current_line)
用你提供的测试数据验证一下:
# 测试代码,和示例中的输入一致 A = np.array([[7,1,0,4], [8,1,5,8], [3,7,2,4], [8,8,2,8]]) B = np.array([[8,6,2,6], [0,3,8,5], [7,8,7,3], [6,0,8,9]]) niceprint(A, "*", B, "=", A @ B)
运行后就能得到你想要的输出效果啦!
函数工作原理
- 数组处理:把每个Numpy数组转换成字符串,按换行拆分成单独的行,保留Numpy默认的数组格式,同时去除多余的空白。
- 运算符对齐:对于
*、=这类运算符,只在所有行的垂直居中位置显示运算符,其他行用相同长度的空格填充,保证运算符和矩阵的中间行对齐,视觉上更美观。 - 逐行拼接:把每行对应的数组片段和运算符片段拼接起来,逐行打印,最终形成横向对齐的矩阵运算表达式。
灵活调整
- 如果你的矩阵行数是奇数(比如3行),函数会自动把运算符放在正中间的行;如果是偶数行,就放在上半部分的最后一行(比如4行的话放在第2行)。
- 你可以通过
op_width和eq_width参数自定义运算符周围的空格宽度,比如把op_width设为9,*的左右就会有更多空格。 - 如果需要支持其他运算符,只需要在处理非数组参数时添加对应的宽度判断逻辑即可。
备注:内容来源于stack exchange,提问作者Stop US and Israel
相关产品推荐
相关产品推荐

