Numpy n-диагональная матрица вещания разложения - PullRequest
0 голосов
/ 05 марта 2019

Я хотел бы знать, есть ли лучший способ использовать преимущества широковещательного массива Python, чтобы избежать использования двух внутренних циклов for следующего минимального примера:

import numpy as np

# Parameters
n_t = 10
n_ddl = 3

# Typical dummy M n_ddl-diagonal matrix
x = np.arange(1,31)
x1 = np.arange(1,21)
x2 = np.arange(1,11)
M = np.diag(x) + np.diag(x1, 10) + np.diag(x1, -10) + np.diag(x2, 20) + np.diag(x2, -20)

# First loop remains
for i in range(0,n_t):
    M_i = np.zeros((n_ddl,n_ddl))
    # Optimize the following to get M_i
    for j in range(0,n_ddl,1):
        for k in range(0,n_ddl,1):
            M_i[j,k] = M[j*n_t+i,k*n_t+i]

Любойпредложения по улучшению синтаксиса или сокращению времени вычислений будут с благодарностью.Спасибо.

# Answer suggested using slicing
# First loop remains
for i in range(0,n_t):
    M_i_slicing = M[i:n_ddl*n_t:n_t,i:n_ddl*n_t:n_t]

1 Ответ

3 голосов
/ 06 марта 2019

Просто нарежьте с подходящими размерами шагов и запустите и, следовательно, удалите две внутренние петли -

for i in range(0,n_t):
    M_i = M[i::n_t,i::n_t]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...