Python - 对于沿网格对角线的循环
Python - For loops along grid diagonals
我有一个网格 x=np.linspace(-1,1,n); y=x
。我用 for
循环
为每个 x
和 y
执行一些计算
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
s 之间的步长来解决这个问题(这样我就不会做 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
定义为零数组循环)
在 numpy
中,尽可能使用 advantage of broadcasting 会有所帮助。在这种情况下,您可以设置一个二维网格,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)
您会发现这样的计算效率更高。
如果您想限制您的域,您可以使用屏蔽来实现:
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)
,则第一张图像中没有遮蔽结果,第二张图像中的遮蔽结果为:
我有一个网格 x=np.linspace(-1,1,n); y=x
。我用 for
循环
x
和 y
执行一些计算
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
s 之间的步长来解决这个问题(这样我就不会做 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
定义为零数组循环)
在 numpy
中,尽可能使用 advantage of broadcasting 会有所帮助。在这种情况下,您可以设置一个二维网格,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)
您会发现这样的计算效率更高。
如果您想限制您的域,您可以使用屏蔽来实现:
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)
,则第一张图像中没有遮蔽结果,第二张图像中的遮蔽结果为: