Scipy с функциями boost :: python

все.
Я пытаюсь найти минимум функции, которую я экспортировал в файл * .pyd, используя boost :: python.

def SaturationDensity(C):
return optimize.minimize(lambda z:SNM_BED(z, C), 1.0)

def SNM_BED(n, C):
return eos.t_E(0.5*n, 0.5*n, C)/(Dim*n) - m_n

где eos — это имя модуля. В подпрограмме scipy.optimize.minimize происходит сбой в строке

#optimize.py
def wrap_function(function, args):
ncalls = [0]
def function_wrapper(x):
ncalls[0] += 1
return function(x, *args) # <---Here
return ncalls, function_wrapper

с Boost.Python.ArgumentError:Python argument types in eos.t_E(numpy.ndarray, numpy.ndarray, KVOR) did not match C++ signature: t_E(double, double, class set_const *)

поэтому Сципи пытается передать ndarray непосредственно в мою функцию C ++.
(KVOR унаследован от класса set_const, и это не проблема).

Я пытался заменить return function(x, *args) с return map(lambda z: function(z, *args), x), но, похоже, здесь передаются не только списки (ndarrays) x, но и скаляры, поэтому карта сообщает об ошибке.

Также я попытался проверить, является ли x итеративным или нет, используя следующий код:

try:
it = iter(x)
except TypeError:
return function(x, *args)

return map(lambda z: function(z, *args),x)

но это не удается в другом месте в optimize.py:

File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 589, in approx_fprime
grad = numpy.zeros((len(xk),), float)
TypeError: object of type 'numpy.float64' has no len()

У меня есть некоторые проблемы, как это в, я не помню, какая функция scipy, но я мог бы решить это с помощью map, Это общая проблема всех функций scipy? И что делать в этом случае?

3

Решение

Просто добавь n = float(n) поверх вашей рутины SNM_BED.

Обычно 1-элементные ndarrays при необходимости автоматически приводятся к плавающим значениям, но boost :: python слишком требователен для этого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]