<code>tril</code>

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

是一种更优雅的方法来提取Sympy矩阵的下部三角形部分?

是确保原始矩阵完整性的推荐方法?

sympy,.copy()enter image description here将在KTH对角下方给出下部三角形元素。默认值为M.lower_triangular(k)

k=0

其他答案建议使用

In [99]: M Out[99]: ⎡a b c⎤ ⎢ ⎥ ⎢d e f⎥ ⎢ ⎥ ⎣g h i⎦
matrix sympy
2个回答
4
投票

np.tril

由于符号,它将
In [100]: np.tril(M)
Out[100]: 
array([[a, 0, 0],
       [d, e, 0],
       [g, h, i]], dtype=object)
转换为

M

2
投票
numpy
.

sympy.Matrix

作为一般规则混合和

In [101]: def tril (M): ...: m = M.copy() ...: for row_index in range (m.rows): ...: for col_index in range (row_index + 1, m.cols): ...: m[row_index, col_index] = 0 ...: return (m) ...: In [102]: tril(M) Out[102]: ⎡a 0 0⎤ ⎢ ⎥ ⎢d e 0⎥ ⎢ ⎥ ⎣g h i⎦
会导致混乱,即使不是错误。  
sympy

最适合数字工作。它可以处理诸如

numpy
之类的非数字对象,但是数学是命中或修复的。
函数构建在
numpy

函数上:

symbols

我们可以从中制作一个符号矩阵:
np.tri...

做元素乘法:
np.tri
In [114]: np.tri(3).astype(int)
Out[114]: 
array([[1, 0, 0],
       [1, 1, 0],
       [1, 1, 1]])
通过将列数组与一行比较:
来起作用:

In [115]: m1 = Matrix(np.tri(3).astype(int)) In [116]: m1 Out[116]: ⎡1 0 0⎤ ⎢ ⎥ ⎢1 1 0⎥ ⎢ ⎥ ⎣1 1 1⎦

另一个答案建议
In [117]: M.multiply_elementwise(m1) Out[117]: ⎡a 0 0⎤ ⎢ ⎥ ⎢d e 0⎥ ⎢ ⎥ ⎣g h i⎦
。  查看其代码很有趣:

np.tri
IT对每个元素应用

In [123]: np.arange(3)[:,None]>=np.arange(3) Out[123]: array([[ True, False, False], [ True, True, False], [ True, True, True]]) In [124]: _.astype(int) Out[124]: array([[1, 0, 0], [1, 1, 0], [1, 1, 1]])

测试。
lower_triangular
必须在行和列上迭代。

您可以简单地使用numpy函数:
    def entry(i, j):
        return self[i, j] if i + k >= j else self.zero

    return self._new(self.rows, self.cols, entry)

*当然,如下所述,您应该转换回
i>=j

。但这取决于您接下来要做什么。

为什么不使用MatrixSymbol?遵循Smichr的建议,您的解决方案可能看起来像:

_new

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.