我正在尝试从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 npt = 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] = valprint(z)
3 回答
慕侠2389804
TA贡献1719条经验 获得超6个赞
您在这里要求的就是Toeplitz矩阵,即:
矩阵,其中从左到右的每个下降对角线是恒定的
一个区别是您需要矩阵的下三角形。
您碰巧很幸运,可以使用它scipy.linalg.toeplitz来构建矩阵,然后np.tril访问下三角形。
import numpy as np
from scipy.linalg import toeplitz
v = 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 array
t = np.pad(v[::-1], (0, v.shape[0]-1), mode='constant')
添加回答
举报
0/150
提交
取消