Являются ли r
, theta
и c
постоянными? Если вы опубликуете минимальный рабочий пример, другим будет легче помочь вам.
В любом случае, вы можете воспользоваться вещанием , чтобы сделать что-то вроде:
X = np.outer(x,vec1)
Y = np.outer(y,vec2)
Z = np.reshape(X[:,np.newaxis] + Y[np.newaxis],(x_coord*y_coord,N))
M = np.sum(np.cos(2.*np.pi*r*Z+theta),axis=1)*c
m = np.reshape(M,(x_coord,y_coord))
Когда я попробовал это с r
, theta
и c
в качестве констант, это дало тот же результат. Я думаю, что это также будет хорошо работать, если они являются точечными векторами.
Как это работает
Ключевое наблюдение заключается в том, что почти все операции выполняются по точкам и одинаковы для всех пар x,y
. Поэтому нам нужно только выяснить, как векторизовать сложение всех пар vec1*x
и vec2*y
.
Сначала мы создаем списки X=vec1*x
и Y=vec2*y
, используя внешний продукт.
Теперь добавим все пары строк X
и Y
, используя трансляцию.
Затем мы преобразовываем его в список всех пар, применяем остальную часть функции по точкам и суммируем по правильной оси.
Наконец, мы преобразуем его из ndarray длины x_coord*y_coord
в 2d массив формы (x_coord,y_coord)
.
Это не очень эффективно для памяти, так как мы строим все элементы всех сумм одновременно, но если вы не работаете с большими данными, все будет хорошо. Даже если вы работаете с достаточным количеством данных, чтобы не поместиться в память, возможно, имеет смысл заблокировать этот метод, а не использовать цикл Python.