一、简介
幻方(Magic Square)是一类特殊方阵,方阵内每行、每列、两条对角线上所有元素相加的总和完全相等。 本文使用numpy构造6阶幻方矩阵,matplotlib绘制热力图。
二、完整代码
import numpy as np import matplotlib.pyplot as plt # 设置中文显示以及负号正常展示 plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False # 定义6阶幻方矩阵 A = np.array([ [35, 1, 6, 26, 19, 24], [3, 32, 7, 21, 23, 25], [31, 9, 2, 22, 27, 20], [8, 28, 33, 17, 10, 15], [30, 5, 34, 12, 14, 16], [4, 36, 29, 13, 18, 11] ]) # 幻方校验模块 print("===== 幻方校验结果 =====") n = A.shape[0] magic_sum = n * (n**2 + 1) / 2 print(f"理论幻和:{magic_sum}") row_sum = np.sum(A, axis=1) print(f"各行之和:{row_sum}") col_sum = np.sum(A, axis=0) print(f"各列之和:{col_sum}") diag1_sum = np.trace(A) diag2_sum = np.trace(np.fliplr(A)) print(f"主对角线和:{diag1_sum}") print(f"反对角线和:{diag2_sum}") is_magic = np.all(row_sum == magic_sum) and np.all(col_sum == magic_sum) and (diag1_sum == magic_sum) and (diag2_sum == magic_sum) if is_magic: print("✅ 校验通过,这是合法6阶幻方!") else: print("❌ 校验失败,不是幻方!") # 绘制热力图 plt.figure(figsize=(6, 6)) im = plt.imshow(A, cmap='jet') plt.colorbar(im, label="数值大小") plt.title('6阶幻方矩阵可视化', fontsize=14) plt.xlabel('列', fontsize=12) plt.ylabel('行', fontsize=12) # 在每个单元格标注数字 for i in range(n): for j in range(n): plt.text(j, i, str(A[i, j]), ha='center', va='center', color='white', fontsize=12) plt.tight_layout() plt.show()三、代码解析
1. 库导入与中文配置
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = Falsenumpy:负责矩阵存储、求和等数值运算;matplotlib.pyplot:绘图库,实现矩阵可视化;rcParams:配置环境,解决 matplotlib 中文方框乱码、负号显示异常问题。
2. 幻方矩阵定义
通过np.array()创建 6×6 二维数组,矩阵元素为 1~36,无重复数字,构成 6 阶幻方。
A = np.array([ [35, 1, 6, 26, 19, 24], [3, 32, 7, 21, 23, 25], [31, 9, 2, 22, 27, 20], [8, 28, 33, 17, 10, 15], [30, 5, 34, 12, 14, 16], [4, 36, 29, 13, 18, 11] ])3. 幻方校验代码
n = A.shape[0] magic_sum = n * (n**2 + 1) / 2 row_sum = np.sum(A, axis=1) col_sum = np.sum(A, axis=0) diag1_sum = np.trace(A) diag2_sum = np.trace(np.fliplr(A))A.shape[0]:获取矩阵行数;np.sum(A, axis=1):按行求和;np.sum(A, axis=0):按列求和;np.trace():求矩阵迹,即主对角线元素之和;np.fliplr(A):矩阵左右翻转,用于计算反对角线之和;np.all():批量判断数组全部元素是否满足条件,校验所有行、列的和是否等于幻和。
4. 热力图绘制
plt.figure(figsize=(6, 6)) im = plt.imshow(A, cmap='jet') plt.colorbar(im, label="数值大小")plt.figure()创建画布,设置画布尺寸;plt.imshow()将二维矩阵渲染为热力图,cmap='jet'为彩虹配色;plt.colorbar()添加颜色条,建立颜色与数值的映射关系。
for i in range(n): for j in range(n): plt.text(j, i, str(A[i, j]), ha='center', va='center', color='white', fontsize=12)双重循环遍历矩阵,plt.text()在每个单元格中心写入对应数字。ha='center'水平居中,va='center'垂直居中。plt.tight_layout()自动调整布局,防止文字重叠;plt.show()展示图像。
四、运行结果
- 控制台输出程序会打印理论幻和、每行之和、每列之和、两条对角线之和,最后输出幻方校验结果。本案例会输出校验通过。
- 图像输出生成一张 6×6 矩阵热力图,颜色代表数值大小,红色代表大数,蓝色代表小数,每个方格内标注幻方数字,右侧附带颜色标尺。
测试小实验:修改矩阵中任意一个数字,重新运行代码,幻方校验模块会直接判定幻方不合法。
五、总结
本文通过 numpy 实现矩阵运算,matplotlib 完成矩阵热力可视化,将抽象的幻方数学模型转为直观图像。 该案例可以帮助初学者理解二维矩阵操作、矩阵求和以及数据可视化的基本思路。