python 在numpy中将一维数组转换为上三角方阵(反对角)

odopli94  于 2022-12-17  发布在  Python
关注(0)|答案(2)|浏览(233)

我有一个数组如下:

arr = np.numpy([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21])

我想做的是把这个数组转换成一个反对角的上三角方阵。预期的输出如下所示:

output = [
    [1,  2,  3,  4,  5,  6],
    [7,  8,  9,  10, 11, 0],
    [12, 13, 14, 15, 0,  0],
    [16, 17, 18, 0,  0,  0],
    [19, 20, 0,  0,  0,  0],
    [21, 0,  0,  0,  0,  0]
]

我采用的方法是创建一个全零的方阵,并使用triu_indices更新索引。

tri = np.zeros((6, 6))
tri[np.triu_indices(6, 1)] = arr

然而,这给了我错误:ValueError: shape mismatch: value array of shape (21,) could not be broadcast to indexing result of shape (15,)
请注意,1-d和矩阵的大小将始终分别为21和6x6。
不知道我犯了什么错误。这是正确的路要走吗?或者有更好的方法来代替这个?我将感激任何帮助。

s3fp2yjn

s3fp2yjn1#

您需要使用k=0和修改列索引(通过减去行索引):

arr = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21])

tri = np.zeros((6, 6))
idx, col = np.triu_indices(6, k=0)
tri[idx, col-idx] = arr

输出:

array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [ 7.,  8.,  9., 10., 11.,  0.],
       [12., 13., 14., 15.,  0.,  0.],
       [16., 17., 18.,  0.,  0.,  0.],
       [19., 20.,  0.,  0.,  0.,  0.],
       [21.,  0.,  0.,  0.,  0.,  0.]])
jaxagkaj

jaxagkaj2#

两个数组大小不兼容。必须将“arr”重新整形为(6,6)的大小

arr = arr.reshape((6, 6))

tri = np.triu(arr)

print(tri)

相关问题