2017-11-03 12 views
2

Angenommen, ich habe eine Funktion, die eine Liste von Argumenten akzeptiert. Liste kann von variabler Länge sein und die Funktion ist in Ordnung. Zum Beispiel:Wie programmgesteuert Interagieren Argumente festlegen?

import math 
import numpy as np 
import matplotlib.pyplot as plt 
from ipywidgets import interact, interactive, fixed, interact_manual 
import ipywidgets as widgets 
%matplotlib inline 

def PlotSuperposition(weights): 
    def f(x): 
     y = 0 
     for i, weight in enumerate(weights): 
      if i==0: 
       y+=weight 
      else: 
       y += weight*math.sin(x*i) 
     return y 
    vf = np.vectorize(f) 
    xx = np.arange(0,6,0.1) 
    plt.plot(xx, vf(xx)) 
    plt.gca().set_ylim(-5,5) 

PlotSuperposition([1,1,2]) 

zeigt

enter image description here

kann ich für bestimmte Anzahl von Argumenten codieren interagieren, wie hier

interact(lambda w0, w1, w2: PlotSuperposition([w0,w1,w2]), w0=(-3,+3,0.1), w1=(-3,+3,0.1), w2=(-3,+3,0.1)) 

die

enter image description here

zeigt

Aber wie kann ich die Anzahl der Schieberegler programmgesteuert definieren?

versuchte ich

n_weights=10 
weight_sliders = [widgets.FloatSlider(
     value=0, 
     min=-10.0, 
     max=10.0, 
     step=0.1, 
     description='w%d' % i, 
     disabled=False, 
     continuous_update=False, 
     orientation='horizontal', 
     readout=True, 
     readout_format='.1f', 
    ) for i in range(n_weights)] 
interact(PlotSuperposition, weights=weight_sliders) 

aber erhielt Fehler

TypeError: 'FloatSlider' object is not iterable 

innen PlotSuperposition sagen, dass interact nicht eine Liste von Werten an die Funktion nicht besteht.

Wie zu erreichen?

Antwort

2

Zuerst ändern Sie Ihre Funktion eine beliebige Anzahl von Keyword-Argumente statt einer einfachen Liste zu nehmen:

def PlotSuperposition(**kwargs): 
    def f(x): 
     y = 0 
     for i, weight in enumerate(kwargs.values()): 
      if i==0: 
       y+=weight 
      else: 
       y += weight*math.sin(x*i) 
     return y 
    vf = np.vectorize(f) 
    xx = np.arange(0,6,0.1) 
    plt.plot(xx, vf(xx)) 
    plt.gca().set_ylim(-5,5) 

Hinweis die Sternchen vor kwargs. Dann rufen Sie interact mit einem Wörterbuch von Schlüssel/Wert-Argumente:

kwargs = {'w{}'.format(i):slider for i, slider in enumerate(weight_sliders)} 

interact(PlotSuperposition, **kwargs) 

enter image description here

Verwandte Themen