为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2021-04-09 14:10:37
我正在尝试从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')


查看完整回答
反对 回复 2021-04-20
  • 3 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信