【发布时间】:2017-08-10 07:42:17
【问题描述】:
我需要为二维数组执行以下集成:
也就是说,网格中的每个点都得到值 RC,它是整个字段与字段 U 在某一点 (x,y) 的值之间的差值的 2D 积分,乘以标准化内核,一维版本为:
到目前为止,我所做的是对索引的低效迭代:
def normalized_bimodal_kernel_2D(x,y,a,x0=0.0,y0=0.0):
""" Gives a kernel that is zero in x=0, and its integral from -infty to
+infty is 1.0. The parameter a is a length scale where the peaks of the
function are."""
dist = (x-x0)**2 + (y-y0)**2
return (dist*np.exp(-(dist/a)))/(np.pi*a**2)
def RC_2D(U,a,dx):
nx,ny=U.shape
x,y = np.meshgrid(np.arange(0,nx, dx),np.arange(0,ny,dx), sparse=True)
UB = np.zeros_like(U)
for i in xrange(0,nx):
for j in xrange(0,ny):
field=(U-U[i,j])*normalized_bimodal_kernel_2D(x,y,a,x0=i*dx,y0=j*dx)
UB[i,j]=np.sum(field)*dx**2
return UB
def centerlizing_2D(U,a,dx):
nx,ny=U.shape
x,y = np.meshgrid(np.arange(0,nx, dx),np.arange(0,ny,dx), sparse=True)
UB = np.zeros((nx,ny,nx,ny))
for i in xrange(0,nx):
for j in xrange(0,ny):
UB[i,j]=normalized_bimodal_kernel_2D(x,y,a,x0=i*dx,y0=j*dx)
return UB
您可以在此处查看centeralizing 函数的结果:
U=np.eye(20)
plt.imshow(centerlizing(U,10,1)[10,10])
【问题讨论】:
-
实际使用中
U.shape是什么? -
我认为这个问题会在codereview.stackexchange.com得到更好的答案
-
不,更多
numpy的人在这里闲逛。这是一个纯粹的numpy向量化问题。 -
最大的效率提升是您在
(nx/dx, ny/dx)meshgrid上创建和运行计算,但仅对其中的(nx, ny)切片求和。或者也许这是一个错误,很难说。输出是否符合您的预期?
标签: python arrays numpy convolution integral