【问题标题】:scipy.optimize.curve_fit error- result from function not a proper array of floatsscipy.optimize.curve_fit 错误 - 函数的结果不是正确的浮点数组
【发布时间】:2013-09-04 00:40:10
【问题描述】:

我正在尝试将 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)

【问题讨论】:

    标签: python numpy scipy


    【解决方案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]])
    

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

    【讨论】:

      【解决方案2】:

      关于你的第二个问题,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)
      

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2020-03-26
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 2019-02-14
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 2021-04-11
        相关资源
        最近更新 更多