如何更简洁高效地实现SymPy矩阵的逐元素比较?
SymPy矩阵逐元素比较的简洁实现方式
SymPy本身没有专门返回逐元素布尔矩阵的内置函数,但可以通过几种更紧凑的方式实现,替代你当前的嵌套列表推导式,同时支持返回SymPy布尔Matrix、列表或NumPy数组:
方法1:利用Matrix构造器的lambda生成式
写法最简洁,直接通过矩阵形状和元素生成逻辑构造结果,返回SymPy布尔Matrix:
from sympy import Matrix def element_wise_compare(mat1, mat2): return Matrix(mat1.shape, lambda i, j: mat1[i, j] == mat2[i, j])
方法2:行级迭代的列表推导式
通过zip两个矩阵的行(转为列表后)逐元素比较,可读性更强,返回SymPy布尔Matrix:
from sympy import Matrix def element_wise_compare(mat1, mat2): return Matrix([[a == b for a, b in zip(row1, row2)] for row1, row2 in zip(mat1.tolist(), mat2.tolist())])
方法3:转换为NumPy数组比较(返回np.array)
适合需要NumPy数组结果的场景,大矩阵下效率更高,返回布尔型numpy数组;若需转回SymPy Matrix,用Matrix(结果)包裹即可:
import numpy as np from sympy import Matrix def element_wise_compare(mat1, mat2): return np.array(mat1.tolist()) == np.array(mat2.tolist())
方法4:利用SymPy矩阵的可迭代性
SymPy矩阵默认按列优先迭代元素,结合reshape快速构造结果,代码最简洁,返回SymPy布尔Matrix:
from sympy import Matrix def element_wise_compare(mat1, mat2): return Matrix([a == b for a, b in zip(mat1, mat2)]).reshape(*mat1.shape)
额外提示
如果仅需判断两个矩阵是否完全逐元素相等(不需要每个元素的比较结果),可以直接使用SymPy内置方法:
mat1.elementwise_equal(mat2) # 返回单个布尔值
内容的提问来源于stack exchange,提问作者upe
相关产品推荐
相关产品推荐

