【问题标题】:Dumping optimization output into an array将优化输出转储到数组中
【发布时间】:2018-01-02 06:18:43
【问题描述】:

我正在尝试运行 3 次跳盆模拟,并将 x 和 f(x) 的每个元组保存到 1x2 的数组中,下面的代码是我迄今为止最好的尝试。我不需要关于结果的详细信息,只需要数字元组,我怎样才能以一种我也可以将它们用于进一步处理的方式获得这样的数组(例如,选择最少的不同运行)

from math import *
from math import ceil
from math import floor
import time
from decimal import *
import numpy as np
from scipy.optimize import basinhopping
minimizer_kwargs = {"method": "BFGS"}

def f(x):

    b = 5306246123
    estimator1=(sqrt(b)+x[0])
    estimator2=(sqrt(b)+x[1])
    d=abs(estimator1*estimator2-b)
    return d

b = 5306246123

results = []
for x in range(3): results.append(basinhopping(f, [1,1], minimizer_kwargs=minimizer_kwargs,
niter=1000, stepsize=sqrt(sqrt(b))))
print(results)

(1/3) 示例输出的一部分(例如,我只需要 -6403.48941568、7020.65333737 和此元组的其他 2 个实例):

[                        fun: 2.86102294921875e-06
 lowest_optimization_result:       fun: 2.86102294921875e-06
 hess_inv: array([[ 0.13347587, -0.13347587],
       [-0.13347587,  0.13347587]])
      jac: array([ 79872.,  66432.])
  message: 'Desired error not necessarily achieved due to precision loss.'
     nfev: 463
      nit: 2
     njev: 113
   status: 2
  success: False
        x: array([-6403.48941568,  7020.65333737])
                    message: ['requested number of basinhopping iterations completed successfully']

【问题讨论】:

  • 不太明白,结果是什么结构?如果结果是字典,你不能只做results.append(basinhopping(...)['x'])吗?
  • [r.x for r in results] 怎么样?还是results.append(basinhopping(...).x)
  • user2464424,谢谢它的工作,现在输出如下: [array([-4813.75229033, 5154.36866417]), array([ -9068.45177035, 10357.92460721]), array([ 7749.21249931, -7078) ] 如何单独访问这些数组或处理(即排序)它们?
  • @msalperen 您已将它们放入列表中,因此可以像往常一样通过索引访问它们,因此使用results[0]results[1]results[2]。如果您想逐步查看结果,请执行for item in results:
  • 检查此问题以对列表进行排序:stackoverflow.com/questions/4174941/…

标签: python arrays optimization scipy


【解决方案1】:

我会将解决方案放在一个独立的答案中。

因为basinhopping() 函数的结果是a subclass of dict,所以可以像在任何字典中一样使用方括号表示法访问其元素。例如:

results.append(basinhopping(...)['x'])

一旦所有结果都保存在results 列表中,就可以像在任何列表中一样通过其从零开始的索引来访问它们。获取第一个结果的第二个元素:

results[0][1]

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多