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

时间:2019-02-11 20:52:35

标签: python numpy for-loop numpy-ndarray

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

为每个yfor进行了一些计算
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 = -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定义为零数组) )

1 个答案:

答案 0 :(得分:1)

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),则在第一张图像中没有遮罩,而在第二张图像中则遮罩:

No Masking Masking