如何解决在 Python 中为给定的 k 替换矩阵的所有子对角线
我想替换 k 对角线下的所有子对角线值。
例如:
我们首先导入 numpy 库:
import numpy as np
然后我们创建矩阵:
In [14]: matrix = np.matrix('1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1')
然后我们得到:
In [15]: print(matrix)
Out[16]:
[[1 1 1 1 1 1]
[1 1 1 1 1 1]
[1 1 1 1 1 1]
[1 1 1 1 1 1]
[1 1 1 1 1 1]]
然后我们得到 k = 1 的 k 对角线下的对角线,例如:
In [17]: lowerdiags = [np.diag(matrix,k=e+1).tolist() for e in range(-len(matrix),k)]
In [18]: print(lowerdiags)
Out[19]: [[1],[1,1],1,1]]
而且,我被困在那里,我应该添加什么才能使 k = 1 并将所有值替换为 0,就像这样:(知道我们刚刚找到了次对角线)
[[0 1 1 1 1 1]
[0 0 1 1 1 1]
[0 0 0 1 1 1]
[0 0 0 0 1 1]
[0 0 0 0 0 1]]
甚至对于 k = 0 :
[[1 1 1 1 1 1]
[0 1 1 1 1 1]
[0 0 1 1 1 1]
[0 0 0 1 1 1]
[0 0 0 0 1 1]]
感谢您的帮助和耐心。
解决方法
我通过使用 numpy 方法找到了一种方法:fill_diagonal 并在不同的 k 中移动:
# Import numpy library
import numpy as np
def Exercise_3(matrix,k):
# print initial matrix
print(matrix)
for k in range(-len(matrix)+1,k):
if k < 0:
# Smart slicing when filling diagonals with "np.fill_diagonal" on our matrix for lower diagonals
np.fill_diagonal(matrix[-k:,:k],0)
if k > 0:
# Smart slicing when filling diagonals with "np.fill_diagonal" on our matrix for upper diagonals
np.fill_diagonal(matrix[:-k,k:],0)
if k == 0:
# Just replace the main diagonal by 0
np.fill_diagonal(matrix,0)
# print to see each change on the matrix
#print(matrix)
#print(k)
return matrix
def main():
k = 0
# an another way of creating a matrix
#matrix = np.matrix('1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1')
# matrix of 5 rows and 5 columns filled by 1
matrix = np.array(([1,1,1],[1,1]))
NewMatrix = Exercise_3(matrix,k)
print(NewMatrix)
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。