gpt4 book ai didi

python - 在python中高效生成 "shifted"高斯核

转载 作者:太空狗 更新时间:2023-10-30 02:10:36 25 4
gpt4 key购买 nike

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

例如,如果 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. ]]

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

然而,以这种方式获得我的结果数组感觉太过分了,因为 scipy 必须考虑所有值,而不仅仅是位置 [5, 5] 中的 1,即使它们都是 0。它只对于 64x64 网格需要 300us,但我仍然想知道是否没有更有效的方法来获得 X*Y numpy 数组,其中包含具有任意 x、y 和 sigma 的高斯内核。

最佳答案

一种相当快速的方法是注意高斯是可分离的,因此您可以计算 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()

enter image description here

关于python - 在python中高效生成 "shifted"高斯核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28949249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com