如何组织列表列表的列表以与 scipy.optimize fmin init array 兼容
How to organize list of list of lists to be compatible with scipy.optimize fmin init array
说到scipy我很业余。我正在尝试在多维变量系统上使用 scipy 的 fmin 函数。为了简单起见,我使用列表列表的列表。我的数据是 12 维的,当我输入 np.shape(DATA)
它 returns (3,2,2)
时,我什至不确定 scipy 是否可以处理那么多维度,如果不是没问题我可以减少他们,关键是 optimize.fmin()
函数不接受基于列表的数组作为 x0
初始参数,所以我需要帮助将 x0
数组重写为与 numpy 兼容的数组或整个 DATA数组到 12 维矩阵或类似的东西。
这里有一个更简单的例子来说明这个问题:
from scipy import optimize
import numpy as np
def f(x): return(x[0][0]*1.5-x[0][1]*2.0+x[1][0]*2.5-x[1][1]*3.0)
result = optimize.fmin(f,[[0.1,0.1],[0.1,0.1]])
print(result)
它会给出一个错误说 invalid index to scalar variable
这可能是由于不理解列表结构的 [[],[]]
列表,所以它可能只理解 numpy 数组格式。
那么如何重写它以使其工作,以及我的 (3,2,2) 形列表列表!?
scipy.optimize.fmin
需要函数参数的初始猜测是一个一维数组,其中包含许多适合函数优化的元素。在您的情况下,如果您只需要输出与输入参数具有相同的形状,也许您可以使用 flatten
和 reshape
。基于您的插图代码的示例:
from scipy import optimize
import numpy as np
def f(x):
return x[0]*1.5-x[1]*2.0+x[2]*2.5-x[3]*3.0
guess = np.array([[0.1, 0.1],
[0.1, 0.1]]) # guess.shape is (2,2)
out = optimize.fmin(f, guess.flatten()) # flatten upon input
# out.shape is (4,)
# reshape output according to guess
out = out.reshape(guess.shape) # out.shape is (2,2) again
或 out = optimize.fmin(f, guess.flatten()).reshape(guess.shape)
在一行中。请注意,这也适用于您建议的 3 维数组:
guess = np.arange(12).reshape(3,2,2)
# array([[[ 0, 1],
# [ 2, 3]],
# [[ 4, 5],
# [ 6, 7]],
# [[ 8, 9],
# [10, 11]]])
guess = guess.flatten()
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
guess = guess.reshape(3,2,2)
# array([[[ 0, 1],
# [ 2, 3]],
# [[ 4, 5],
# [ 6, 7]],
# [[ 8, 9],
# [10, 11]]])
说到scipy我很业余。我正在尝试在多维变量系统上使用 scipy 的 fmin 函数。为了简单起见,我使用列表列表的列表。我的数据是 12 维的,当我输入 np.shape(DATA)
它 returns (3,2,2)
时,我什至不确定 scipy 是否可以处理那么多维度,如果不是没问题我可以减少他们,关键是 optimize.fmin()
函数不接受基于列表的数组作为 x0
初始参数,所以我需要帮助将 x0
数组重写为与 numpy 兼容的数组或整个 DATA数组到 12 维矩阵或类似的东西。
这里有一个更简单的例子来说明这个问题:
from scipy import optimize
import numpy as np
def f(x): return(x[0][0]*1.5-x[0][1]*2.0+x[1][0]*2.5-x[1][1]*3.0)
result = optimize.fmin(f,[[0.1,0.1],[0.1,0.1]])
print(result)
它会给出一个错误说 invalid index to scalar variable
这可能是由于不理解列表结构的 [[],[]]
列表,所以它可能只理解 numpy 数组格式。
那么如何重写它以使其工作,以及我的 (3,2,2) 形列表列表!?
scipy.optimize.fmin
需要函数参数的初始猜测是一个一维数组,其中包含许多适合函数优化的元素。在您的情况下,如果您只需要输出与输入参数具有相同的形状,也许您可以使用 flatten
和 reshape
。基于您的插图代码的示例:
from scipy import optimize
import numpy as np
def f(x):
return x[0]*1.5-x[1]*2.0+x[2]*2.5-x[3]*3.0
guess = np.array([[0.1, 0.1],
[0.1, 0.1]]) # guess.shape is (2,2)
out = optimize.fmin(f, guess.flatten()) # flatten upon input
# out.shape is (4,)
# reshape output according to guess
out = out.reshape(guess.shape) # out.shape is (2,2) again
或 out = optimize.fmin(f, guess.flatten()).reshape(guess.shape)
在一行中。请注意,这也适用于您建议的 3 维数组:
guess = np.arange(12).reshape(3,2,2)
# array([[[ 0, 1],
# [ 2, 3]],
# [[ 4, 5],
# [ 6, 7]],
# [[ 8, 9],
# [10, 11]]])
guess = guess.flatten()
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
guess = guess.reshape(3,2,2)
# array([[[ 0, 1],
# [ 2, 3]],
# [[ 4, 5],
# [ 6, 7]],
# [[ 8, 9],
# [10, 11]]])