是确保原始矩阵完整性的推荐方法?
sympy,.copy()
将在KTH对角下方给出下部三角形元素。默认值为
M.lower_triangular(k)
k=0
In [99]: M
Out[99]:
⎡a b c⎤
⎢ ⎥
⎢d e f⎥
⎢ ⎥
⎣g h i⎦
np.tril
In [100]: np.tril(M)
Out[100]:
array([[a, 0, 0],
[d, e, 0],
[g, h, i]], dtype=object)
转换为M
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