Интерактивная функция ноутбука IPython: как сохранить обновленные параметры функции

Я написал код ниже в записной книжке Ipython, чтобы сгенерировать сигмовидную функцию, управляемую параметрами a, которые определяют положение центра сигмоида, и b, который определяет его ширину:

%matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt

def sigmoid(x,a,b):
    #sigmoid function with parameters a = center; b = width
    s= 1/(1+np.exp(-(x-a)/b))
    return 100.0*(s-min(s))/(max(s)-min(s)) # normalize sigmoid to 0-100

x = np.linspace(0,10,256)
sigm = sigmoid(x, a=5, b=1)
fig = plt.figure(figsize=(24,6))
ax1 = fig.add_subplot(2, 1, 1)
ax1.set_xticks([])
ax1.set_xticks([])
plt.plot(x,sigm,lw=2,color='black')
plt.xlim(x.min(), x.max())

Я хотел добавить интерактивность для параметров a и b, поэтому я переписал функцию, как показано ниже:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from IPython.html.widgets import interactive
from IPython.display import display

def sigmoid_demo(a=5,b=1):
    x = np.linspace(0,10,256)
    s = 1/(1+np.exp(-(x-a)/(b+0.1))) # +0.1 to avoid dividing by 0
    sn = 100.0*(s-min(s))/(max(s)-min(s)) # normalize sigmoid to 0-100
    fig = plt.figure(figsize=(24,6))
    ax1 = fig.add_subplot(2, 1, 1)
    ax1.set_xticks([])
    ax1.set_yticks([])
    plt.plot(x,sn,lw=2,color='black')
    plt.xlim(x.min(), x.max())

w=widgets.interactive(sigmoid_demo,a=5,b=1)
display(w)

Можно ли динамически сохранять измененные параметры сигмоидной функции a и b в переменные, так как они изменяются ползунками, чтобы их можно было использовать в другом субплоте или отдельном графике и выполнять дальнейшие вычисления.?

Я просмотрел все примеры интерактивных виджетов, которые мог найти, но не увидел ничего, указывающего в этом направлении (эти виджеты довольно новые, поэтому документация для них не такая обширная, как для других функций). Любые предложения в правильном направлении приветствуются.

1 ответ

Решение

Вы хотите создать плавающий виджет вручную:

from IPython.html.widgets import FloatSlider

# same as before

F1 = FloatSlider(value=5, min=0, max=10)
w=interactive(sigmoid_demo, a=F1, b=7)
display(w)

Тогда вы можете получить доступ F1.value в любое время, и это будет текущее значение ползунка.

Вы также можете перебрать w.widgets но это больно.

Другие вопросы по тегам