在python中有效地生成"移位"高斯核

Cla*_*ude 4 python numpy scipy

我有一个(非常大的)数据点,每个数据点由x和y坐标和sigma不确定性组成(sigma在x和y方向都相同;所有三个变量都是浮点数).对于每个数据点,我想在标准网格上生成一个二维数组,其概率是实际值在该位置.

例如,如果x = 5.0,y = 5.0,sigma = 1.0,在(0,0) - >(9,9)网格上,我希望生成:

   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.01,  0.02,  0.01,  0.  ,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.01,  0.06,  0.1 ,  0.06,  0.01,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.02,  0.1 ,  0.16,  0.1 ,  0.02,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.01,  0.06,  0.1 ,  0.06,  0.01,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.01,  0.02,  0.01,  0.  ,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ]]
Run Code Online (Sandbox Code Playgroud)

上面是通过创建一个带有零的numpy数组生成的,并且[5,5] = 1,然后应用ndimage.filters.gaussian_filtersigma为1.我觉得我可以通过分布在附近的整数值上来处理非整数x和y一个很好的近似值.

然而,由于scipy将不得不考虑所有值,而不仅仅是位置中的1 [5,5],即使它们都是0,因此感觉极度过度杀戮是因为scipy必须考虑所有值.它只需要300us一个64x64的网格,但是,我仍然想知道是否没有更有效的方法来获得具有任意x,y和sigma的高斯内核的X*Y numpy数组.

tom*_*m10 6

一个相当快的方法是注意的是,高斯是可分的,这样你就可以计算出一维高斯的xy,然后采取外积:

import numpy as np
import matplotlib.pyplot as plt

x0, y0, sigma = 5.5, 4.2, 1.4

x, y = np.arange(9), np.arange(9)

gx = np.exp(-(x-x0)**2/(2*sigma**2))
gy = np.exp(-(y-y0)**2/(2*sigma**2))
g = np.outer(gx, gy)
g /= np.sum(g)  # normalize, if you want that

plt.imshow(g, interpolation="nearest", origin="lower")
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述