我正在嘗試從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
提交
取消