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]]])