是否有一种方便的方法来按元素比较两个大小相等的 SymPy 矩阵?
这就是我正在尝试的:
from sympy import Matrix
def element_wise_matrix_comparison(matrix1, matrix2):
result_matrix = Matrix([[matrix1[i, j] == matrix2[i, j] for j in range(matrix1.shape[1])] for i in range(matrix1.shape[0])])
return result_matrix
虽然这段代码按预期工作,但我想知道是否有更简洁或更有效的方法在 SymPy 框架内执行此任务。
理想情况下,比较应返回布尔值 Matrix/list/np.array...
令
A
和 B
为两个符号矩阵。 A == B
将进行结构比较。 A.equals(B)
执行逐元素数学比较。
from sympy import *
from sympy.abc import s, t
A = Matrix([[s, t], [s**2, s+2*t]])
B = Matrix([[s, t], [s**2, Add(s, t, t, evaluate=False)]])
A, B
print(A == B) # False, because the last elements of the matrices are structurally different
print(A.equals(B)) # True
由于矩阵是可迭代的,所以写起来会更紧凑:
a = randMatrix(3,3)
b = Matrix(a); b[1,1] +=x
f = lambda i,j: Symbol("?") if (e:=i.equals(j)) is None else int(e)
>>> ans = Matrix(*a.shape,[f(i,j) for i,j in zip(a,b)]); ans
Matrix([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
您还可以使用 ij 构造函数作为结果矩阵:
>>> ans == Matrix(3,3,lambda i,j: f(a[i,j],b[i,j]))
True
函数‘f’会显示一个“?”如果等式是不确定的,则为符号。
equals
面对不可能完成的任务,我们会尽力而为。
您还可以将
f
应用于两个矩阵的差异:
>>> ans == (a-b).applyfunc(lambda x: f(x,0))
True
从头开始创建一个新的
Matrix
def elementwise_comparison(m1, m2):
return Matrix(*m1.shape, lambda i, j: m1[i,j] == m2[i,j])
通过
numpy
-委托:将 sympy
矩阵转换为 numpy
数组
from sympy import Matrix, matrix2numpy
def elementwise_comparison(m1, m2, dtype=object):
a1 = matrix2numpy(m1, dtype=dtype)
a2 = matrix2numpy(m2, dtype=dtype)
return a1 == a2