【问题标题】:scipy.optimize.leastsq error not an array of floatsscipy.optimize.leastsq 错误不是浮点数组
【发布时间】:2016-02-16 11:50:48
【问题描述】:

这是我的代码

import os
import sys
import numpy as np
import scipy
from scipy.optimize import leastsq


def peval (inp_mat,p):
    m0,m1,m2,m3,m4,m5,m6,m7 = p
    out_mat = np.array(np.zeros(inp_mat.shape,dtype=np.float32))
    mid = inp_mat.shape[0]/2
    for xy in range(0,inp_mat.shape[0]):
        if (xy<(inp_mat.shape[0]/2)):
            out_mat[xy] = ( (  (inp_mat[xy+mid]*m0)+(inp_mat[xy]*m1)+ m2 ) /( (inp_mat[xy+mid]*m6)+(inp_mat[xy]*m7)+1 ) )
        else:
            out_mat[xy] = ( (  (inp_mat[xy]*m3)+(inp_mat[xy-mid]*m4)+ m5 ) /( (inp_mat[xy]*m6)+(inp_mat[xy-mid]*m7)+1 ) )
    return np.array(out_mat)

def residuals(p, out_mat, inp_mat):
    m0,m1,m2,m3,m4,m5,m6,m7 = p
    err=np.array(np.zeros(inp_mat.shape,dtype=np.float32))
    if (out_mat.shape == inp_mat.shape):
        for xy in range(0,inp_mat.shape[0]):
            err[xy] =  err[xy]+ (out_mat[xy] -inp_mat[xy])
        return np.array(err)




f = open('/media/anilil/Data/Datasets/repo/txt_op/vid.txt','r')
x = np.loadtxt(f,dtype=np.int16,comments='#',delimiter='\t')
nof = x.shape[0]/72 # Find the number of frames
x1 = x.reshape(-1,60,40)
x1_1= x1[0,:,:].flatten()
x1_2= x1[1,:,:].flatten()

x= []
y= []

for xy in range(1,50,1):
    y.append(x1[xy,:,:].flatten())
    x.append(x1[xy-1,:,:].flatten())

x=np.array(x,dtype=np.float32)
y=np.array(y,dtype=np.float32)
length =  x1_1.shape#initail guess
p0 = np.array([1,1,1,1,1,1,1,1],dtype=np.float32)

abc=leastsq(residuals, p0,args=(y,x))
print ('Size of first matrix is '+str(x1_1.shape))
print ('Size of first matrix is '+str(x1_2.shape))

print ("Done with program")

我尝试在大多数地方添加 np.array 但没有用。 有人可以帮我吗?

这里的另一个问题是我是否通过将所有errorsnp.sum(err,axis=1) 相加来将残差()的输出作为单个值。还是保持原样?

当我在函数residuals()return np.sum(err,axis=1)。最初的猜测没有变化。它只是保持不变。

I.E 错误针对输入输出映射中的每个项目。还是整体错误?

Example data.

输出

ValueError: object too deep for desired array
Traceback (most recent call last):
  File "/media/anilil/Data/charm/mv_clean/.idea/nose_reduction_mpeg.py", line 49, in <module>
    abc=leastsq(residuals, p0,args=(y,x))
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 378, in leastsq
    gtol, maxfev, epsfcn, factor, diag)
minpack.error: Result from function call is not a proper array of floats.

【问题讨论】:

  • 您能分享您正在使用的数据或至少其中的一部分吗?
  • 添加了你想要的数据
  • 有点晚了,Simon 更快了:您确实只需将np.array(err) 替换为例如np.ravel(err)err.flatten() 并贯穿始终。还要检查问题herehere

标签: python numpy error-handling scipy mathematical-optimization


【解决方案1】:

leastsq 需要从您的 residuals 函数返回一维数组。

目前您计算整个图像的残差并将其作为二维数组返回。

简单的解决方法是展平残差数组(将 2D 数组变成 1D 数组)。

所以不要返回

return np.array(err)

改为这样做

return err.flatten()

请注意,err 已经是一个 numpy 数组,因此不需要在返回之前强制转换(我猜当您尝试调试它时,它会滑入!)

【讨论】:

  • 试过了..它不会抛出任何错误,但 p0 永远不会改变..让我觉得我做错了什么。
  • leastsq 不会就地修改 p0。相反,它返回最佳参数。 (以及其他一些东西)有关详细信息,请参阅此docs.scipy.org/doc/scipy/reference/generated/…。您会希望 x 在它返回的内容列表中。
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多