You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用列表元素填充方阵的对角线与非对角线元素并解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:06:08