1

我正在尝试将 2-d voigt 轮廓拟合到图像的一个子部分(impart),其中 position 是一个数组,用于保存整个图像中相应的 x 和 y 坐标以进行分配。

根据两个打印语句的输出,在我看来,下面的代码确实应该工作。

另外,如果有人对如何更快地构建位置数组有任何快速建议,我将不胜感激 numpy ndarrays 的一些建议。我对他们还是有点陌生​​。

import numpy as np
from scipy.special import wofz
from scipy.optimize import curve_fit
from math import pi

def voigt2d(pos,a,bx,by,Gc,Lc):
    val = np.zeros((5,5))

    for y in range(5):
        for x in range(5):
            dst = np.sqrt((pos[y][x][0]-bx)**2+(pos[y][x][1]-by)**2)

            z = ((dst+(Lc*1j))/(Gc*np.sqrt(2)))
            val[y][x] = a*wofz(z).real/(Gc*np.sqrt(2*pi))
    print val
    print val.dtype
    return val

x = np.arange(93,98)
y = np.arange(7,12)

xpos = np.array([x,x,x,x,x])
ypos = np.array([y,y,y,y,y])
ypos = np.rot90(ypos,k=3)

position = np.dstack((xpos,ypos))

impart = np.array([
    [971, 2425, 4331, 4280, 2697,],
    [1199, 3416, 6517, 4813, 2412],
    [1333, 3957, 7210, 4019, 2183],
    [1494, 4115, 4817, 3085, 1758],
    [1185, 2273, 2805, 2811, 1797]
    ],dtype=np.float64)

p,cov = curve_fit(voigt2d,position,impart)
4

2 回答 2

1

关于您的第二个问题,numpy 中有一个方便的网格构造函数:

y,x = pos = np.mgrid[7:12,93:98]

这将完全返回您手动构建的数组。另请注意,numpy 允许在整个数组之间进行操作,而不仅仅是标量,从而消除了 voigt2d 中两个循环的需要:

def voigt2d(pos,a,bx,by,Gc,Lc):
    y,x = pos
    dst = np.sqrt((x-bx)**2+(y-by)**2)
    z = ((dst+(Lc*1j))/(Gc*np.sqrt(2)))
    val = a*wofz(z).real/(Gc*np.sqrt(2*pi))

正如 Bhajun 所说,curve_fit 需要一个一维数组,因此您需要将结果展平:

    return np.ravel(val)

希望有帮助。

于 2013-09-03T16:40:10.857 回答
1

我不确定这是否会为您解决,但我相信您的问题与curve_fit期望您的模型函数返回模型数据的一维数组这一事实有关。因此,最简单的做法是将自变量 ( position) 表示为一维数组:

>>> x = np.arange(93,98)
>>> y = np.arange(7,12)
>>> position = np.transpose([np.tile(x, len(x)), np.repeat(y, len(y))])
>>> position
array([[93,  7],
       [94,  7],
       [95,  7],
       [96,  7],
       [97,  7],
       [93,  8],
       [94,  8],
       [95,  8],
       [96,  8],
       [97,  8],
       [93,  9],
       [94,  9],
       [95,  9],
       [96,  9],
       [97,  9],
       [93, 10],
       [94, 10],
       [95, 10],
       [96, 10],
       [97, 10],
       [93, 11],
       [94, 11],
       [95, 11],
       [96, 11],
       [97, 11]])

然后你必须调整你的模型函数来适应这个新数组。

于 2013-09-02T19:59:19.183 回答