множественные вызовы с одинаковыми аргументами для функции python выводят разные возвращаемые значения - PullRequest
0 голосов
/ 11 ноября 2019

Это должно быть довольно простое недоразумение с моей стороны. У меня есть функция, которая возвращает функцию интерполяции на основе случайных значений.

fct = create_interp_fct(x,y)

Теперь fct - это вызываемая функция интерполяции. Например:

fct([0,0,0,0,0,0])

возвращает

array([[ 0.75894378,  0.72761319, -0.23003647, -0.34790905, -0.51531125,
        -0.91211147]])

Функция определяется примерно следующим образом:

def create_interp_fct(x,y):
    u,v = compute_some_random_values(x,y)
    return RegularGridInterpolator(u,v) #from from scipy.interpolate

Проблема заключается в том, что если я вызову fct([0,0,0,0,0,0]) снова получаю другой вывод. Таким образом, очевидно, что функция переопределена на основе новых случайных значений. Мой вопрос: как я могу использовать fct , чтобы он не переопределялся при каждом вызове? Представьте себе, что вычисление fct очень дорого, но называть его нет. Как я могу "сохранить" мою текущую вычисленную функцию? Или, например, посмотрите на все машинное обучение из scikit (линейная регрессия и т. Д.). Если я позвоню

 lr = lm.LinearRegression() # import sklearn.linear_model as lm
 lr.fit(M,n)

, вы не сможете сказать мне, что каждый раз, когда я вызываю lr.score (M, n), линейная регрессия пересчитывается?

1 Ответ

0 голосов
/ 12 ноября 2019

Проблема недетерминированного вывода из данного экземпляра fct не повторяется в следующем примере:

In [13]: paste                                                                                                                                                                      

import numpy
from scipy.interpolate import RegularGridInterpolator                                                                                                                      

def compute_some_random_values(shape):
    return [numpy.arange(extent) for extent in shape], numpy.random.uniform(0, 1, size=shape)

def create_interp_fct(shape):
    u,v = compute_some_random_values(shape)
    return RegularGridInterpolator(u,v) #from from scipy.interpolate

## -- End pasted text --


In [24]: fct = create_interp_fct([2,3,4,5,6,7])                                                                                                                                     

In [25]: fct([0,0,0,0,0,0])                                                                                                                                                         
Out[25]: array([0.24572906])

In [26]: fct([0,0,0,0,0,0])                                                                                                                                                         
Out[26]: array([0.24572906])

In [27]: fct([0,0,0,0,0,0])                                                                                                                                                         
Out[27]: array([0.24572906])

In [28]: fct([0,0,0,0,0,0])                                                                                                                                                         
Out[28]: array([0.24572906])

Я подозреваю, что где-то в логике вашей программыВы обновили fct между вызовами, снова позвонив fct = create_interp_fct(...), не осознавая этого. Это естественным образом перепроверяет вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...