python динамически создает словарь для ограничений в scipy - PullRequest
1 голос
/ 23 мая 2019

Я использую процедуру scipy.optimize.minimize (...), и мне нужно указать аргумент ограничений, который принимает форму:

N = 50
cons = ({'type': 'ineq', 'fun': lambda x: x[0]<x[1]},
               {'type': 'ineq', 'fun': lambda x: x[1]<x[2]},
               {'type': 'ineq', 'fun': lambda x: x[2]<x[3]}, 
               ...)

, который содержит $ N $ кортежей в форме {'type': 'ineq', 'fun': lambda x: x [i]

Я хотел бы создать такой словарь, используя цикл (или другой способ) в духе

cons = dict([{'type':'ineq','fun':lambda x[i]<x[i+1]} for i in range(0,N)])

Я попытался:

cons = zip(['fun' for i in range(0,N)], [lambda x: x[i]<x[i+1] for i in range(0,N)])

, но это не работает, и я не знаю, как управлять несколькими ключами и значениями.

1 Ответ

1 голос
/ 24 мая 2019

Эта проблема сложна из-за того, как python выполняет свои поздние привязки закрытия ... См. этот ответ .По сути, вам нужно сделать это:

N = 50
cons = tuple({'type':'ineq','fun':(lambda x, i=i: x[i] < x[i + 1])} for i in range(N))
print(cons[0]['fun']((1, 2, 3)))
...