Python scipy遇到了一个奇怪的虫子,你觉得呢?

Python scipy遇到了一个奇怪的虫子,你觉得呢?,python,numpy,scipy,Python,Numpy,Scipy,我正在做一个优化项目,我在scipy上遇到了一个非常奇怪的bug。在多次执行目标函数后,其参数向量神奇地变成了一个二维数组(但它一直被认为是一个一维数组),而没有任何明确的指令。 有人遇到过同样的事情吗? 这可能是一个scipy错误,还是我应该再次检查我的代码 我的意思是,如果我的代码中有错误,我看不出在正确执行多次迭代之后发生错误的任何原因 每次调用目标函数时,我都打印x及其形状。这是目标函数中的代码 def objective(x, some, other, parameters..):

我正在做一个优化项目,我在scipy上遇到了一个非常奇怪的bug。在多次执行目标函数后,其参数向量神奇地变成了一个二维数组(但它一直被认为是一个一维数组),而没有任何明确的指令。 有人遇到过同样的事情吗? 这可能是一个scipy错误,还是我应该再次检查我的代码

我的意思是,如果我的代码中有错误,我看不出在正确执行多次迭代之后发生错误的任何原因

每次调用目标函数时,我都打印x及其形状。这是目标函数中的代码

def objective(x, some, other, parameters..):

    print("current x",x)
    print("current x.shape",x.shape)

    some code here...


    score = calculate_objective_function(some_parameters_here...)
    return -score
下面是发生的事情

current x [-2322.83367669 13868.03814803     0.        ]
current x.shape (3,)
0
current x [-2322.83367669 13868.03814803     0.        ]
current x.shape (3,)
1
current x [-2321.83367669 13868.03814803     0.        ]
current x.shape (3,)
2
current x [-2324.45171069 13868.03814803     0.        ]
current x.shape (3,)
3
current x [-2322.83367669 13868.03814803     0.        ]
current x.shape (3,)
4
current x [-2323.45171067 13868.03814803     0.        ]
current x.shape (3,)
5
current x [-2322.45171069 13868.03814803     0.        ]
current x.shape (3,)
6
current x [[-2322.8237272  13868.03814803     0.        ]]
current x.shape (1, 3)
Traceback (most recent call last):
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/optimization_image.py", line 692, in <module>
    solution = minimize(objective,x0,method='Powell',args= additional_and_point_cloud, callback= callback_fun)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/_minimize.py", line 590, in minimize
    return _minimize_powell(fun, x0, args, callback, **options)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2612, in _minimize_powell
    tol=xtol * 100)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2398, in _linesearch_powell
    alpha_min, fret, iter, num = brent(myfunc, full_output=1, tol=tol)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2109, in brent
    res = _minimize_scalar_brent(func, brack, args, **options)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2141, in _minimize_scalar_brent
    brent.optimize()
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 1992, in optimize
    fu = func(*((u,) + self.args))      # calculate new output value
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2397, in myfunc
    return func(p + alpha*xi)
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 326, in function_wrapper
    return function(*(wrapper_args + args))
  File "/home/mingzhe/PycharmProjects/ZebraFinder/venv/optimization_image.py", line 550, in objective
    centroid = image_coordinate_from_world_coordinate(np.array([x[0],x[1]]),scale_factor,min_point_world)
IndexError: index 1 is out of bounds for axis 0 with size 1

Process finished with exit code 1
当前x[-2322.83367669 13868.03814803 0]
当前x.shape(3,)
0
当前x[-2322.83367669 13868.03814803 0]
当前x.shape(3,)
1.
当前x[-2321.83367669 13868.03814803 0.]
当前x.shape(3,)
2.
当前x[-2324.45171069 13868.03814803 0]
当前x.shape(3,)
3.
当前x[-2322.83367669 13868.03814803 0]
当前x.shape(3,)
4.
当前x[-2323.45171067 13868.03814803 0]
当前x.shape(3,)
5.
当前x[-2322.45171069 13868.03814803 0]
当前x.shape(3,)
6.
当前x[[-2322.8237272 13868.03814803 0.]]
当前x形状(1,3)
回溯(最近一次呼叫最后一次):
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/optimization_image.py”,第692行,在
解决方案=最小化(目标,x0,方法='Powell',参数=额外的点云,回调=回调乐趣)
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/_minimize.py”,第590行,最小化
return\u最小化\u powell(fun、x0、args、callback、**选项)
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/optimize.py”,第2612行,位于鲍威尔
tol=xtol*100)
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/optimize.py”,第2398行,在“linesearch”中
alpha_min,fret,iter,num=brent(myfunc,满输出=1,tol=tol)
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/optimize.py”,第2109行,布伦特
res=\u最小化\u标量\u布伦特(func、brack、args、**选项)
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/optimize.py”,第2141行,位于brent
布伦特
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/optimize.py”,第1992行,在optimize中
fu=func(*(u,)+self.args))#计算新的产值
myfunc中的文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/optimize.py”,第2397行
返回函数(p+alpha*xi)
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/lib/python3.5/site packages/scipy/optimize/optimize.py”,第326行,在函数包装器中
返回函数(*(包装器参数+参数))
文件“/home/mingzhe/PycharmProjects/ZebraFinder/venv/optimization_image.py”,第550行,在objective中
质心=来自世界坐标的图像坐标(np.数组([x[0],x[1])、比例因子、最小点坐标)
索引器:索引1超出大小为1的轴0的界限
进程已完成,退出代码为1


更新:问题由@HYRY的答案解决。My score calculation函数返回1*1 numpy矩阵,而不是定标器。在强制转换为float后,它会按预期工作。

可能返回的分数值不是标量值,例如:

import numpy as np
from scipy import optimize

cnt = 0
def f(x):
    global cnt
    print(x.shape)
    cnt += 1
    if cnt < 10:
        return np.sum(x**2)
    else:
        e = np.full((1, 1), fill_value=np.sum(x**2))
        return e

optimize.minimize(f, [0, 0, 1], method="powell")
将numpy导入为np
从scipy导入优化
cnt=0
def f(x):
全球碳纳米管
打印(x.shape)
cnt+=1
如果cnt<10:
返回np.和(x**2)
其他:
e=np.full((1,1),fill_值=np.sum(x**2))
返回e
优化。最小化(f[0,0,1],method=“powell”)

你能添加错误和生成错误的代码吗?是的@ladygremlin,我添加了信息问题的标题不正确,你能把它改得更合适吗?嗨@iRohitBhatia,我知道标题可能不够准确,但情况很奇怪,我真的不知道如何正确描述它。英语不是我的第一语言。很抱歉给您带来了困惑,如果您有任何建议,那就太好了哇,谢谢!分数是通过numpy数组乘法计算的,因此它返回一个2D数组[[score]]作为结果。在强制转换为float之后,代码确实按预期工作。但是你介意详细说明一下背后的原因吗?