Применяя временные сдвиги - PullRequest
2 голосов
/ 24 марта 2020

Рассмотрим массив r с размерами [N, м], где N - временной индекс, а m - количество элементов в сети. , Предположим, что каждый из этих m элементов соединяется друг с другом, но влияние элемента i в элементе j занимает некоторое время, т. Е. задержка между каждым соединением, заданная матрицей задержек delayMat , с размерами [м, м].

Сказал, что у меня есть следующая проблема: я хочу создать матрицу [м, m] со значениями массива r , но с надлежащими временными сдвигами (задержками), примененными после delayMat . Один из способов сделать это с помощью:

delay  = n - delayMat
drate = np.zeros([m,m])
for i in range(m):
    for j in range(m):
        drate[j,i]=r[delay[j,i],i]

Где, n - это индекс фактического времени, уменьшите матрицу с задержанными значениями r для каждого соединения , Это работает, однако, это очень медленно в зависимости от m . Есть ли способ сделать это на numpy более оптимальным образом?

Пример кода (реальный код должен читать много данных, поэтому размещать его здесь непрактично):

import numpy as np 
delayMat = np.random.randint(1,195,[30,30]) 
rate = np.random.normal(0,1,size=(4,1000,30)) 
n = 1000 # current time index 
delay = n-delayMat
drate1 = np.zeros([30,30]) # delayed variable
drate3 = np.zeros([30,30]) 
for pre in range(30): 
    for pos in range(30): 
        drate1[pos,pre]=rate[0,delay[pos,pre],pre] 
        drate3[pos,pre]=rate[2,delay[pos,pre],pre] 

1 Ответ

2 голосов
/ 24 марта 2020

Замените обе петли for на:

drate1=rate[0, delay, np.arange(30)]
drate3=rate[2, delay, np.arange(30)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...