我有一个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
定义为零数组) )
答案 0 :(得分:1)
在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)
,则在第一张图像中没有遮罩,而在第二张图像中则遮罩: