Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:Scipy';NxM阵列的s曲线拟合?_Python_Arrays_Numpy_Scipy_Curve Fitting - Fatal编程技术网

Python:Scipy';NxM阵列的s曲线拟合?

Python:Scipy';NxM阵列的s曲线拟合?,python,arrays,numpy,scipy,curve-fitting,Python,Arrays,Numpy,Scipy,Curve Fitting,通常我使用Scipy.optimize.curve_fit将自定义函数拟合到数据。 本例中的数据始终是一维数组 二维数组有类似的函数吗 例如,我有一个10x10 numpy阵列。然后我有一个函数,它做了一些事情,创建了一个10x10 numpy数组,我想对这个函数进行拟合,这样得到的10x10数组最适合输入数组 也许举个例子更好:) 现在应安装a和b,以便新数据尽可能接近数据 到目前为止,我得到的是: data1D = numpy.ravel(data) data_X = numpy.arang

通常我使用Scipy.optimize.curve_fit将自定义函数拟合到数据。 本例中的数据始终是一维数组

二维数组有类似的函数吗

例如,我有一个10x10 numpy阵列。然后我有一个函数,它做了一些事情,创建了一个10x10 numpy数组,我想对这个函数进行拟合,这样得到的10x10数组最适合输入数组

也许举个例子更好:)

现在应安装a和b,以便新数据尽可能接近数据

到目前为止,我得到的是:

data1D = numpy.ravel(data)
data_X = numpy.arange(data1D.size)
fit = curve_fit(dostuff,data_X,data1D)
但印花合身只会让我

(array([ 1.]), inf)

我在数组中确实有一些N,也许这是个问题?

目标是将2D函数表示为1D函数:
g(x,y…)-->f(xy…)

将坐标对
(x,y)
转换为单个数字
xy
一开始可能看起来很棘手。但其实很简单。只需枚举所有数据点,就有一个唯一定义每个坐标对的数字。拟合函数只需重建原始坐标,进行计算并返回结果

在20x10图像中拟合二维线性渐变的示例:

import scipy as sp
import numpy as np
import matplotlib.pyplot as plt

n, m = 10, 20

# noisy example data
x = np.arange(m).reshape(1, m)
y = np.arange(n).reshape(n, 1)
z = x + y * 2 + np.random.randn(n, m) * 3

def f(xy, a, b):
    i = xy // m  # reconstruct y coordinates
    j = xy % m  # reconstruct x coordinates
    out = i * a + j * b
    return out

xy = np.arange(z.size)  # 0 is the top left pixel and 199 is the top right pixel
res = sp.optimize.curve_fit(f, xy, np.ravel(z))

z_est = f(xy, *res[0])
z_est2d = z_est.reshape(n, m)


plt.subplot(2, 1, 1)
plt.plot(np.ravel(z), label='original')
plt.plot(z_est, label='fitted')
plt.legend()

plt.subplot(2, 2, 3)
plt.imshow(z)
plt.xlabel('original')

plt.subplot(2, 2, 4)
plt.imshow(z_est2d)
plt.xlabel('fitted')

目标是将二维函数表示为一维函数:
g(x,y,…-->f(xy,…)

将坐标对
(x,y)
转换为单个数字
xy
一开始可能看起来很棘手。但其实很简单。只需枚举所有数据点,就有一个唯一定义每个坐标对的数字。拟合函数只需重建原始坐标,进行计算并返回结果

在20x10图像中拟合二维线性渐变的示例:

import scipy as sp
import numpy as np
import matplotlib.pyplot as plt

n, m = 10, 20

# noisy example data
x = np.arange(m).reshape(1, m)
y = np.arange(n).reshape(n, 1)
z = x + y * 2 + np.random.randn(n, m) * 3

def f(xy, a, b):
    i = xy // m  # reconstruct y coordinates
    j = xy % m  # reconstruct x coordinates
    out = i * a + j * b
    return out

xy = np.arange(z.size)  # 0 is the top left pixel and 199 is the top right pixel
res = sp.optimize.curve_fit(f, xy, np.ravel(z))

z_est = f(xy, *res[0])
z_est2d = z_est.reshape(n, m)


plt.subplot(2, 1, 1)
plt.plot(np.ravel(z), label='original')
plt.plot(z_est, label='fitted')
plt.legend()

plt.subplot(2, 2, 3)
plt.imshow(z)
plt.xlabel('original')

plt.subplot(2, 2, 4)
plt.imshow(z_est2d)
plt.xlabel('fitted')

我建议使用它,我写下它是为了自动为您处理所有的魔法

你只要把方程写在纸上,然后你就可以进行拟合了

我会这样做:

from symfit import parameters, variables, Fit

# Assuming all this data is in the form of NxM arrays
data = pyfits.getdata('data.fits')
mod1 = pyfits.getdata('mod1.fits')
mod2 = pyfits.getdata('mod2.fits')    
mod3 = pyfits.getdata('mod3.fits')

a, b = parameters('a, b')
x, y, z, u = variables('x, y, z, u')
model = {u: (x * 12) + y**a - z / b}

fit = Fit(model, x=mod1, y=mod2, z=mod3, u=data)
fit_result = fit.execute()
print(fit_result)
不幸的是,我还没有在文档中包含您需要的示例,但是如果您只看一下,我想您可以找到它,以防这无法在开箱即用。

我建议您使用它,我写这篇文章是为了自动为您处理所有的魔法

你只要把方程写在纸上,然后你就可以进行拟合了

我会这样做:

from symfit import parameters, variables, Fit

# Assuming all this data is in the form of NxM arrays
data = pyfits.getdata('data.fits')
mod1 = pyfits.getdata('mod1.fits')
mod2 = pyfits.getdata('mod2.fits')    
mod3 = pyfits.getdata('mod3.fits')

a, b = parameters('a, b')
x, y, z, u = variables('x, y, z, u')
model = {u: (x * 12) + y**a - z / b}

fit = Fit(model, x=mod1, y=mod2, z=mod3, u=data)
fit_result = fit.execute()
print(fit_result)

不幸的是,我还没有在文档中包含您需要的示例,但是如果您只看一下,我想您可以找到它,以防这无法直接实现。

您有一些示例数据吗?您是否尝试过将数据和函数的输出展平?这应该使它们都是一维的,以配合曲线拟合。我不确定这是否可行。在我的例子中,NxM numpy数组表示一个图像。如果我将其展平,则在边缘处,其值可能会有非常急剧的跳跃,这可能不利于拟合。@Pythoneer如果该函数还创建了一个展平的二维图像,则这不是问题。它将包含相同的跳转。。。啊,我想我开始看到问题了…一个例子总是更好。。。更好的是一个不依赖外部数据的示例:。您有一些示例数据吗?您是否尝试过展平数据和函数的输出?这应该使它们都是一维的,以配合曲线拟合。我不确定这是否可行。在我的例子中,NxM numpy数组表示一个图像。如果我将其展平,则在边缘处,其值可能会有非常急剧的跳跃,这可能不利于拟合。@Pythoneer如果该函数还创建了一个展平的二维图像,则这不是问题。它将包含相同的跳转。。。啊,我想我开始看到问题了…一个例子总是更好。。。更好的是一个不依赖外部数据的示例:。这看起来非常有希望,我将尝试一下。谢谢!嗯,我很难理解函数的坐标分离。假设我有一个依赖于变量a和b的函数,实际的计算是(array*a)**b。如何分别为每个坐标执行此操作?它仍然是(i*a)**b+(j*a)**b吗?到目前为止,我得到的是,我将输入数据作为数组,并使用np.ravel()将其转换为1D。我需要第二个数组,比如我的计算中的B,我还创建了一个1D版本。现在我有了def dostuff(a,b),它有((12*B1D)*a)**b并返回它。但是,如果我让fit使用fit=curve_fit(dostuff,data_X,data1D)执行它的操作,它只返回(array([1.]),inf)。看起来操作(*a)**b应用于数组的每个元素,与元素的位置无关。在这种情况下,您不必担心坐标或1D/2D。。。但是什么是
array
?看起来很有希望,我会试试看。谢谢!嗯,我很难理解函数的坐标分离。假设我有一个依赖于变量a和b的函数,实际的计算是(array*a)**b。如何分别为每个坐标执行此操作?它仍然是(i*a)**b+(j*a)**b吗?到目前为止,我得到的是,我将输入数据作为数组,并使用np.ravel()将其转换为1D。我需要第二个数组,比如我的计算中的B,我还创建了一个1D版本。现在我有了def dostuff(a,b),它有((12*B1D)*a)**b并返回它。但是,如果我让fit使用fit=curve_fit(dostuff,data_X,data1D)执行它的操作,它只返回(array([1.]),inf)。看起来操作(*a)**b应用于数组的每个元素,与元素的位置无关。在这种情况下,您不必担心坐标或1D/2D。。。但是什么是
数组