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

zon*_*510 5 python performance numpy

我试图从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]
Run Code Online (Sandbox Code Playgroud)

我没有意识到没有使用for循环的方法,并且计算效率对于使用它的任务非常重要.没有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)
Run Code Online (Sandbox Code Playgroud)

use*_*203 9

你在这里要求的是一个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')
Run Code Online (Sandbox Code Playgroud)

求解矩阵并访问下三角形:

np.tril(toeplitz(t, v))
Run Code Online (Sandbox Code Playgroud)

而我们的输出!

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]])
Run Code Online (Sandbox Code Playgroud)

要概括此方法,只需t从以下形状计算必要的填充v:

v = # any one dimension array
t = np.pad(v[::-1], (0, v.shape[0]-1), mode='constant')
Run Code Online (Sandbox Code Playgroud)