Numpy добавление значений к диагоналям

Я хочу создать массив NxNnumpy, в котором заполняется только все, что выше главной диагонали. Его заполнение состоит в том, что основная диагональ (k=0) заполнена gamma**0, диагональ k=1 заполнена gamma**1, диагональ k=2 заполнена gamma**2 и т. д.

gamma = 0.9
dim = 4

M = np.zeros((dim,dim))
for i in range(dim)[::-1]:   
    M += np.diagflat([gamma**(dim-i-1)]*(i+1),dim-i-1) 

print(M)

Это правильно дает

array([[ 1.   ,  0.9  ,  0.81 ,  0.729],
       [ 0.   ,  1.   ,  0.9  ,  0.81 ],
       [ 0.   ,  0.   ,  1.   ,  0.9  ],
       [ 0.   ,  0.   ,  0.   ,  1.   ]])

Я хотел спросить, есть ли более простые или элегантные способы справиться с этим или что-то другое. Я буду часто работать с многомерными массивами, и мне хотелось вдохновляться различными инструментами и подходами.

1
0
369
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из способов - создать верхние треугольные индексы с помощью np.triu_indices, а затем использовать расширенное индексирование для присвоения значений этим позициям:

M = np.zeros((dim,dim))

rowidx, colidx = np.triu_indices(dim)
# the diagonal offset can be calculated by subtracting the row index from column index
M[rowidx, colidx] = gamma ** (colidx - rowidx) 

M
#array([[ 1.   ,  0.9  ,  0.81 ,  0.729],
#       [ 0.   ,  1.   ,  0.9  ,  0.81 ],
#       [ 0.   ,  0.   ,  1.   ,  0.9  ],
#       [ 0.   ,  0.   ,  0.   ,  1.   ]])

Другие вопросы по теме