SymPy 矩阵的逐元素比较

问题描述 投票:0回答:3

是否有一种方便的方法来按元素比较两个大小相等的 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...

python sympy
3个回答
2
投票

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

0
投票

由于矩阵是可迭代的,所以写起来会更紧凑:

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

0
投票

从头开始创建一个新的

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
© www.soinside.com 2019 - 2024. All rights reserved.