如何使用列表元素填充方阵的对角线与非对角线元素并解决np.fill_diagonal报错
问题解决方法
一、报错原因
numpy.fill_diagonal 是原地修改输入矩阵的方法,没有返回值(默认返回None)。你在循环中将该方法的返回值重新赋值给Hmat,第一次循环结束后Hmat就变成了None,第二次循环调用np.fill_diagonal时就会触发NoneType相关的属性报错。
二、正确实现步骤
1. 对角线填充
不需要循环遍历对角线元素,直接传入整个对角线列表即可完成填充:
import numpy as np i = 4 # 初始化4*4零矩阵 Hmat = np.zeros((i,i), dtype=float) # 对角线元素列表 diagonal_elements = [a, b, c, d] # 直接填充对角线,无需赋值回Hmat np.fill_diagonal(Hmat, diagonal_elements)
2. 非对角线元素填充
按照你给出的位置规则,非对角线元素按行优先顺序依次填入所有行索引≠列索引的位置,可通过以下代码实现:
# 非对角线元素列表,共4*4-4=12个元素 off_diag_elements = [e, f, g, h, i, j, k, l, m, n, o, p] # 生成所有非对角线的坐标,按行优先排序 off_diag_indices = np.where(~np.eye(i, dtype=bool)) # 按顺序填入非对角线元素 Hmat[off_diag_indices] = off_diag_elements
三、完整运行示例
用具体数值做演示:
import numpy as np i = 4 Hmat = np.zeros((i,i), dtype=float) # 对角线元素 diag = [1,2,3,4] np.fill_diagonal(Hmat, diag) # 非对角线元素 off_diag = [5,6,7,8,9,10,11,12,13,14,15,16] off_diag_idx = np.where(~np.eye(i, dtype=bool)) Hmat[off_diag_idx] = off_diag print(Hmat)
运行后输出符合你要求的矩阵:
[[ 1. 5. 6. 7.] [ 8. 2. 9. 10.] [11. 12. 3. 13.] [14. 15. 16. 4.]]
内容的提问来源于stack exchange,提问作者Xdrake
相关产品推荐
相关产品推荐

