Python:需要帮助将数字列表放入方形矩阵的下三角(提供的示例)

Python:需要帮助将数字列表放入方形矩阵的下三角(提供的示例),python,numpy,linear-algebra,Python,Numpy,Linear Algebra,例如: 给定一个随机列表,比如说a1=[1.5],或者a2=[2,3,-1],或者a3=[5,6,7,2,3,1] 如何填充对应矩阵的下三角形,如 array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) 到 或者 到 我尝试了好几次来解决这个问题,但我的代码非常复杂,最终都是错误的。更糟糕的是,我无法粘贴代码而不会收到一个错误,说我的格式错误。下面是部分代码的图片 我不能发布照片,因为我没有必要的声誉点

例如:

给定一个随机列表,比如说
a1=[1.5]
,或者
a2=[2,3,-1]
,或者
a3=[5,6,7,2,3,1]

如何填充对应矩阵的下三角形,如

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]]) 

或者

我尝试了好几次来解决这个问题,但我的代码非常复杂,最终都是错误的。更糟糕的是,我无法粘贴代码而不会收到一个错误,说我的格式错误。下面是部分代码的图片

我不能发布照片,因为我没有必要的声誉点数

代码现在可以工作了!看下面

# n is the length of your list (i.e. n =len(numbers))
for j in range(n-1):
    for i in range(1+j,n):
    matrix[i][j]=numbers.pop(0)

您可以使用
numpy.tril_索引
numpy.triu_索引
,具体取决于您对条目的排序方式。以下示例将另外注意不要设置对角线条目:

import numpy as np
size = 4

m = np.eye(size)  # identity matrix
j, i = np.triu_indices(size, 1)

the_list = np.arange(size * (size - 1) / 2)[::-1] + 1  # The list of entries
print the_list  # yields [6, 5, 4, 3, 2, 1]

# Set the entries
m[i, j] = the_list 

print m
# yields
# array([[ 1.,  0.,  0.,  0.],
#        [ 6.,  1.,  0.,  0.],
#        [ 5.,  3.,  1.,  0.],
#        [ 4.,  2.,  1.,  1.]])

请注意,如果要按行顺序设置,可以使用
i,j=np.tril\u索引(size,-1)
。如果您想设置对角线,那么删除
np.triu_index

中的第二个参数,我认为可能
total=[4,3,2]
应该是
numbers=[4,3,2]
,至少从期望的结果来判断。我被一个小问题分散了注意力。我的更新代码如下。['code']numbers=[4,5,6]size=n matrix=numpy.eye(size)j,k=numpy.triu_index(size)diag_entries=j==kj=j[~diag_entries]k=k[~diag_entries]the_list=numbers matrix[i,j]=the_list我重新写了我的问题,以便更容易理解。请阅读。我看到你现在已经删除了你的代码。所以:这个问题并没有表明你已经做了任何努力来解决它。'np.tril_index'需要第二个参数,对角线偏移量。对于OP的例子,他可以简单地做:
m[np.tril_index(m.shape[0],-1)]=_列表
。除了生成一个列表,您如何调整给定数字列表的代码?(也就是说,列表是[4,8,7],你想要一个矩阵的形式[[1,0,0],[4,1,0],[8,7,1]]谢谢@Jaime,我完全忽略了这个参数。这会使示例更简洁。@user3373665你的意思是从列表的长度猜出矩阵的形状吗?这只在列表的长度为
n*(n-1)的情况下有效)/2
。如果列表长度不同,您可以选择下一个更大的大小,当然,但是您将如何放置元素?
array([[ 1.,0.],
       [ 1.5, 1.]]) 
# n is the length of your list (i.e. n =len(numbers))
for j in range(n-1):
    for i in range(1+j,n):
    matrix[i][j]=numbers.pop(0)
import numpy as np
size = 4

m = np.eye(size)  # identity matrix
j, i = np.triu_indices(size, 1)

the_list = np.arange(size * (size - 1) / 2)[::-1] + 1  # The list of entries
print the_list  # yields [6, 5, 4, 3, 2, 1]

# Set the entries
m[i, j] = the_list 

print m
# yields
# array([[ 1.,  0.,  0.,  0.],
#        [ 6.,  1.,  0.,  0.],
#        [ 5.,  3.,  1.,  0.],
#        [ 4.,  2.,  1.,  1.]])