Векторизация Python numpy для рассеивания тепла

Я должен написать код для представления рассеивания тепла с использованием формулы конечных разностей, приведенной ниже.

????(????)????????=(????(????−1)[????+1,????] + ????(????−1) [????−1,????] +????(????−1)[????,????+1] + ????(????−1)[????,????−1])/4 Предполагается, что формула выдает результат только для временного шага 1. Итак, если был задан такой массив:

100   100   100   100   100  
100    0     0     0    100  
100    0     0     0    100  
100    0     0     0    100  
100   100   100   100   100

Результирующий массив на временном шаге 1 будет таким:

100   100   100   100   100  
100    50    25    50   100   
100    25     0    25   100  
100    50    25    50   100  
100   100   100   100   100

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

h = np.copy(u)
for i in range(1,h.shape[0]-1):
    for j in range (1, h.shape[1]-1):
        num = u[i+1][j] + u[i-1][j] + u[i][j+1] + u[i][j-1]
        h[i][j] = num/4

Но я не могу понять, как векторизовать код для представления рассеивания тепла. Я должен использовать массивы numpy и векторизацию, и мне не разрешено использовать циклы for любого рода, и я думаю, что должен полагаться на нарезку, но я не могу понять, как это записать и начал с.

r, c = h.shape
if(c==2 or r==2):
    return h

Я уверен, что если строки = 2 или столбцы = 2, то массив возвращается как есть, но поправьте меня, если я ошибаюсь. Любая помощь будет принята с благодарностью. Благодарю вас!


person confused    schedule 08.06.2020    source источник


Ответы (1)


Пытаться:

h[1:-1,1:-1] = (h[2:,1:-1] + h[:-2,1:-1] + h[1:-1,2:] + h[1:-1,:-2]) / 4

Это решение использует нарезку, где:

  • 1:-1 остается для индексов 1,2, ..., LAST - 1
  • 2: остается на 2, 3, ..., ПОСЛЕДНИЙ
  • :-2 остается на 0, 1, ..., ПОСЛЕДНИЙ - 2

Во время каждой итерации обновляются только внутренние элементы (индексы 1..LAST-1).

person tstanisl    schedule 08.06.2020