【问题标题】:scipy.optimize.minimize returning zero-dimensional array?scipy.optimize.minimize 返回零维数组?
【发布时间】:2018-07-23 02:46:45
【问题描述】:

为单维问题调用 Powell 最小化器会创建一个具有不可访问值的 OptimizeResult。例如:

from scipy.optimize import minimize
test = minimize(lambda x: 1.0, np.array([1.0]), method="Powell")

如果我然后要求test.x 我得到:

array(3.58792896)

那个“数组”有问题:我无法从中获取价值。例如,test.x[0] 返回IndexError: too many indices for array。就好像它是一个零维数组,或者有一些其他的引用问题。

(格式良好的ndarray 会显示为array([3.58792896])。)

我做错了什么?

【问题讨论】:

  • Numpy 有零维数组:stackoverflow.com/questions/773030/…
  • 使用test.x[()]获取值。
  • 这确实是一个零维数组,但是虽然 NumPy 完全支持零维数组,但 minimize 调用仍然不应该是一个。
  • 这可能是一个错误。正如文档所说,结果应该与输入具有相同的长度。除了Powell 之外的所有其他方法都有这种行为。也许在 github 问题上报告这个?

标签: python numpy scipy numpy-ndarray


【解决方案1】:

这是一个 0 维数组,但它不应该是。虽然 0 维数组是 NumPy 中受支持的概念,但 minimize 调用不应该创建一个。 It looks like the devs are worried about breaking backward compatibility if they fix this,所以目前不太可能修复。

我建议使用numpy.atleast_1d 来处理这种情况与返回一维数组的情况一致,并且如果它们最终更改返回值则向前兼容:

test = minimize(...)
if not test.success:
    handle_that()
result = np.atleast_1d(test.x)

对于您期望 0D 数组并想要检索存储值的情况,请使用 0 索引的元组对其进行索引:

value = zero_d_array[()]

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多