生成 2D 分布避免循环

Generate 2D distribution avoiding loops

我想在形式为 (Nx, Ny) 的数组上构造一个类似 2D Gassuian 的分布:

 return np.exp(-0.5*((x-xp)**2 + (y-yp)**2)/SG**2)

在这种情况下,(x,y) 对应于 [i, j] 矩阵索引。

我通过遍历 np.zeros((Nx,Ny)) 矩阵并使用定义的函数更新其值来完成此操作。

基本上,我想知道是否有办法生成类似的结果但避免我在这里使用的 for 循环。我的直觉告诉我 np.meshgridzip(x, y) 应该这样做,但我一直无法复制它。

(我想避免使用辅助 distribution_Gp 函数并能够直接使用 normardist 函数)。

这是我如何一起使用它们的示例代码:

import numpy as np
def normaldist(x, y, Nx, Ny, xp, yp, SG=1):
    """2D-mesh (Nx,Ny) with Gaussian distribution values."""
    z = np.exp(-0.5*((x-xp)**2 + (y-yp)**2)/SG**2)
#     /(SG*np.sqrt(np.pi*2.)))  # non-normalized
    return z


def distribution_Gp(Nx, Ny, xp, yp, SG=1):
    """Fill up the C0(Nx, Ny) array for the specified values and conditions."""
    mask = np.zeros((Nx, Ny))
    for j in range(0, Ny):
        for i in range(0, Nx):
            if(i <= Nx*Ny*normaldist(i, j, Nx, Ny, xp, yp, SG)):
                mask[i, j] = normaldist(i, j, Nx, Ny, xp, yp, SG)
    return mask
Nx = 11
Ny = Nx
arr_img = distribution_Gp(Nx, Ny, Nx//2, Ny//3, SG=2)

具有正态分布采样值的矩阵可以通过以下方式完成:

np.random.normal(mean, std, (Nx, Ny))

其中 NxNy 是输出的形状,如您的代码所示。

如果您想将任何自定义函数应用于矩阵,可以通过以下方式实现:

arr = np.zeros((Nx, Ny))
f = lambda x: x + 3
result = f(arr)

通过使用 lambda 并使用两个参数和 meshgrid 可以复制 distribution_Gp

使用 lambda 并避免使用中间函数:

x = np.linspace(0, 10, Nx)
y = np.linspace(0, 10, Ny)
arr = np.zeros((Nx, Ny))
f = lambda x, y: normaldist(x, y, Nx//2, Ny//3, SG=2).T
X, Y = np.meshgrid(x, y)
result = f(X, Y)

产生与以下相同的结果:

result = distribucio_de_puntsG(Nx, Ny, Nx//2, Ny//L, SG=2)