如何修正代码实现用列表从左到右填充对角线全零的二维数组?
问题
我有一个列表:
idmatrixlist=[0.61, 0.63, 0.54, 0.82, 0.58, 0.57]
需要从左到右填充一个二维数组,同时保持对角线元素全为零。
我尝试了以下代码,但得到的元素顺序不符合要求:
import numpy as np lowertriangleidmatrix = np.zeros((4,4)) indexer = np.tril_indices(4,k=-1) lowertriangleidmatrix[indexer] = idmatrixlist print(lowertriangleidmatrix)
运行结果:
[[0. 0. 0. 0. ] [0.61 0. 0. 0. ] [0.63 0.54 0. 0. ] [0.82 0.58 0.57 0. ]]
请问如何调整代码以得到正确的元素顺序?
解决方案
你需要填充的是上三角区域(不含对角线)且按行优先顺序,当前代码使用tril_indices操作的是下三角区域,所以元素顺序不符合预期。以下是两种针对性调整方案:
方案1:使用上三角索引匹配“从左到右”填充
直接替换为triu_indices(4, k=1),它会返回上三角区域(对角线以上、不含对角线)的行、列索引,且按行优先顺序排列,完全匹配“从左到右”的填充需求:
import numpy as np idmatrixlist = [0.61, 0.63, 0.54, 0.82, 0.58, 0.57] target_matrix = np.zeros((4,4)) # 使用上三角索引,k=1表示跳过对角线 indexer = np.triu_indices(4, k=1) target_matrix[indexer] = idmatrixlist print(target_matrix)
运行结果:
[[0. 0.61 0.63 0.54] [0. 0. 0.82 0.58] [0. 0. 0. 0.57] [0. 0. 0. 0. ]]
方案2:若需下三角区域但调整填充顺序
如果实际需求是填充下三角区域,但要改变当前的列优先顺序,可以通过反转列表元素的方式调整:
import numpy as np idmatrixlist = [0.61, 0.63, 0.54, 0.82, 0.58, 0.57] target_matrix = np.zeros((4,4)) indexer = np.tril_indices(4, k=-1) # 反转列表后赋值,改变下三角的填充顺序 target_matrix[indexer] = idmatrixlist[::-1] print(target_matrix)
运行结果:
[[0. 0. 0. 0. ] [0.57 0. 0. 0. ] [0.58 0.82 0. 0. ] [0.54 0.63 0.61 0. ]]
根据你描述的“从左到右填充”,方案1应该是符合预期的最终解决方案。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

