从numpy中的1d向量映射2d延迟向量

我正在尝试从1D向量生成2D向量,其中元素沿行沿每一行递增。


我希望我的输入看起来像这样:


input:

t = [t1, t2, t3, t4, t5]


out = 

[t5,  0,  0,  0,  0]

[t4, t5,  0,  0,  0]

[t3, t4, t5,  0,  0]

[t2, t3, t4, t5,  0]

[t1, t2, t3, t4, t5]

[ 0, t1, t2, t3, t4]

[ 0,  0, t1, t2, t3]

[ 0,  0,  0, t1, t2]

[ 0,  0,  0,  0, t1]

我不知道不使用for循环就可以做到这一点的方法,并且计算效率对于使用this进行任务很重要。有没有办法做到这一点而无需for循环?


这是我的代码使用for循环:


import numpy as np


t = np.linspace(-3, 3, 7)

z = np.zeros((2*len(t) - 1, len(t)))


diag = np.arange(len(t))

for index, val in enumerate(np.flip(t, 0)):

    z[diag + index, diag] = val


print(z)


沧海一幻觉
浏览 152回答 3
3回答

慕侠2389804

您在这里要求的就是Toeplitz矩阵,即:矩阵,其中从左到右的每个下降对角线是恒定的一个区别是您需要矩阵的下三角形。您碰巧很幸运,可以使用它scipy.linalg.toeplitz来构建矩阵,然后np.tril访问下三角形。import numpy as npfrom scipy.linalg import toeplitzv = np.array([1, 2, 3, 4, 5])t = np.pad(v[::-1], (0, 4), mode='constant')求解矩阵并访问下三角:np.tril(toeplitz(t, v))和我们的输出!array([[5, 0, 0, 0, 0],       [4, 5, 0, 0, 0],       [3, 4, 5, 0, 0],       [2, 3, 4, 5, 0],       [1, 2, 3, 4, 5],       [0, 1, 2, 3, 4],       [0, 0, 1, 2, 3],       [0, 0, 0, 1, 2],       [0, 0, 0, 0, 1]])要推广此方法,只需根据t以下形状计算必要的填充v:v = # any one dimension arrayt = np.pad(v[::-1], (0, v.shape[0]-1), mode='constant')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python