NumPy - Создать матрицу верхнего треугольника angular с диагоналями возрастающей мощности - PullRequest
1 голос
/ 09 июля 2020

Я хотел бы создать квадратную верхнюю три angular матрицу, которая определяется следующим образом для некоторого числа с плавающей точкой 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]]

Как это сделать?

1 Ответ

1 голос
/ 09 июля 2020

Это простой способ сделать это:

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]]
...