Как заменить цикл for векторизацией в numpy?

avatar
Barry1628
8 апреля 2018 в 07:49
81
1
0

Вот моя функция, и я знаю, что цикл for работает медленно Должен быть более быстрый/лучший способ сделать это в numpy

import numpy as np

def heat(u):
    my_u = np.empty_like(u)
    np.copyto(my_u, u)
    for row in range(1,u.shape[0]-1):
        for col in range(1,u.shape[1]-1):
            my_u[row, col] = (u[row-1][col] + u[row+1][col] 
            + u[row][col-1] + u[row][col+1])/4
    return my_u

print(heat(np.array([[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)

avatar
ahed87
8 апреля 2018 в 08:57
0

Вы уверены, что хотите добавить только 4 элемента, то есть крест, а не всех соседей? Поиск с помощью «sum Neighbours numpy» здесь, на SO, дает много ответов на то, что должно работать для вас, независимо от пересечения или полного набора соседей с помощью того, как вы его маскируете.

Если вы хотите немного повысить скорость, откажитесь от двойного просмотра массива, это примерно на 30% быстрее.

my_u[row, col] = (u[row-1, col] + u[row+1, col] 
                 + u[row, col-1] + u[row, col+1])/4
Barry1628
9 апреля 2018 в 03:12
0

Да, всего 4 элемента. Извините, я не понимаю, где двойной просмотр. Я до сих пор не могу найти ответ, который работает для меня