NumPy - 使用递增幂的对角线创建上三角矩阵

NumPy - Create Upper Triangular Matrix with Diagonals of Increasing Power

我想创建一个正方形上三角矩阵,其定义如下,用于一些浮点数 c 和一些维度 N:

[[1 , c , c^2, ... c^N],
 [0,  1 ,   c, ... c^{N-1}],
 [0,  0 ,   1, ... c^{N-2}],
 .
 .
 .
 [0,  0 ,   0, ....    1]]

具体来说,如果N=2,那么矩阵应该是

[[1, c],
 [0, 1]]

如果N=3,那么矩阵应该是:


[[1, c, c^2],
 [0, 1,   c],
 [0, 0,   1]]

我该怎么做?

这是一种简单的方法:

import numpy as np

c = 2
n = 5

r = np.arange(n + 1)
p = r - r[:, np.newaxis]
res = np.triu(c ** p.clip(min=0))
print(res)
# [[ 1  2  4  8 16 32]
#  [ 0  1  2  4  8 16]
#  [ 0  0  1  2  4  8]
#  [ 0  0  0  1  2  4]
#  [ 0  0  0  0  1  2]
#  [ 0  0  0  0  0  1]]

如果你想制作一个非常大的矩阵并且想节省时间和内存你也可以这样做:

import numpy as np

c = 2
n = 5

b = np.zeros(2 * n + 1, a.dtype)
b[n:] = c ** np.arange(n + 1)
s, = b.strides
res = np.lib.stride_tricks.as_strided(b[n:], shape=(n + 1, n + 1), strides=(-s, s),
                                      writeable=False)
print(res)
# [[ 1  2  4  8 16 32]
#  [ 0  1  2  4  8 16]
#  [ 0  0  1  2  4  8]
#  [ 0  0  0  1  2  4]
#  [ 0  0  0  0  1  2]
#  [ 0  0  0  0  0  1]]