Python - для петель вдоль диагоналей сетки - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть сетка, которая x=np.linspace(-1,1,n); y=x.Я выполняю некоторые вычисления для каждого x и y с помощью петли for

for a,b in enumerate(x): 
   for c,d in enumrate(y): 
     functionstuff(x,y)

. Чтобы сэкономить время, мне нужно выполнять вычисления только для алмаза в пределах диагоналей, определенных между точками (-1,0)-(0,1)-(1,0)-(0,-1).Поэтому я пытаюсь понять, как лучше всего это сделать.Таким образом, для данного x я хочу перейти от +(1-|x|) к -(1-|x|).

Так как же мне поступить с регулировкой размера шага между меньшими y с (чтобы я не делал x = -1, y = 0 n раз).

Таким образом, я могу сделать объект numpy.array для зацикливания:

for ii,x1 in enumerate(x1):

    y = np.linspace(1-np.abs(x1),-(1-np.abs(x1)),2*round((1-np.abs(x1))/dy) + 1)     
    for jj,y1 in enumerate(y):
       f[ii][jj] = DoStuff(x1,y1)
       xplot[ii][jj] = x1
       yplot[ii][jj] = y1

Когда я хочу посмотреть на plot_surface(xplot,yplot,f), я просто получаю линию вдоль диагонали (я предполагаю, что мне нужно было определитьxplot и yplot как нулевой массив перед циклом)

1 Ответ

0 голосов
/ 22 февраля 2019

В numpy это помогает использовать преимущества вещания , когда вы можете.В этом случае вы можете настроить двумерную сетку X и Y и вычислить ее, а не циклически повторять элементы x и y:

import numpy as np
x = np.linspace(-1,1,N)
y = x.copy()
X,Y = np.meshgrid(x,y,indexing='ij')
Z = functionstuff(X,Y)

YouВы найдете это гораздо более эффективным в вычислительном отношении.

Если вы хотите ограничить свой домен, вы можете сделать это с помощью маскировки:

MASK = (Y<=1+X) & (Y<=1-X) & (Y>=X-1) & (Y>=-X-1)
Z    = np.zeros(X.shape)
Z[MASK] = functionstuff(X[MASK],Y[MASK])

Если functionstuff = lambda x,y: exp(-(x**2+y**2)/2), то маскирование не приводит к этому первому изображению, а маскирование приводит ко второму:

No Masking Masking

...