Python - 对于沿网格对角线的循环

Python - For loops along grid diagonals

我有一个网格 x=np.linspace(-1,1,n); y=x。我用 for 循环

为每个 xy 执行一些计算
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|)

那么我将如何通过调整较小的 ys 之间的步长来解决这个问题(这样我就不会做 x = -1y = 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) 时,我只得到一条沿对角线的线(我的猜测是我之前必须将 xplotyplot 定义为零数组循环)

numpy 中,尽可能使用 advantage of broadcasting 会有所帮助。在这种情况下,您可以设置一个二维网格,XY 并对其进行计算,而不是循环遍历 xy 的元素:

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)

您会发现这样的计算效率更高。

如果您想限制您的域,您可以使用屏蔽来实现:

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),则第一张图像中没有遮蔽结果,第二张图像中的遮蔽结果为: