分段函数

Piecewise functions

我是 python 的新手,想知道为什么我不能绘制如下所示的分段函数,以及为什么会弹出错误消息?

def get_data(self, frame):
    self.ydata =np.piecewise(self.xdata, [self.xdata<.2, self.xdata>=.2][ np.sin((self.frequency) * self.xdata +
                                                                frame), np.sin((5*self.frequency) * self.xdata + frame)])

它说我的错误是

  line 72, in get_data
    frame), np.sin((5*self.frequency) * self.xdata + frame)])
TypeError: list indices must be integers or slices, not tuple

我想我的问题也可能是我会将分段函数绑定到什么?这是一个动画,我正在为我第二次尝试的变量分段执行此操作,但我不知道如果我想要 x<.2 我应该放什么 'x' 因为我的 x 值处于排列设置中。

我不确定问题中的 self 是什么。我下面的代码作为一个函数工作,但如果需要可以更改为一个方法。

您的错误信息是条件列表和函数列表之间没有逗号引起的。

def get_data(self, frame):        
    self.ydata =np.piecewise(self.xdata, [self.xdata<.2, self.xdata>=.2]  # Must be a comma here
        [ np.sin((self.frequency) * self.xdata + frame), 
          np.sin((5*self.frequency) * self.xdata + frame) ] )

另一个问题是函数列表必须是函数,而不是函数的结果。

import numpy as np    

def get_data(xdata, frame):
    def f_lt(x):
        return np.sin( frequency * x + frame)

    def f_ge(x):                                                                                              
        return np.sin( 5*frequency * x + frame)  

    return np.piecewise(xdata, [xdata<.2, xdata>=.2], [ f_lt, f_ge ])

frequency = 1.0

xdata = np.arange(1,26)/25
get_data(xdata, 0.1) 
# array([ 0.13954311,  0.17902957,  0.21822962,  0.25708055,  0.89120736,
#         0.96355819,  0.99749499,  0.99166481,  0.94630009,  0.86320937,
#         0.74570521,  0.59847214,  0.42737988,  0.23924933,  0.04158066,
#        -0.15774569, -0.35078323, -0.52983614, -0.68776616, -0.81827711,
#        -0.91616594, -0.97753012, -0.99992326, -0.98245261, -0.92581468])

我不确定你要做什么,所以我无法测试结果,但也许这有帮助。

编辑: 回复评论。

get_data(x, frame) 可以根据需要随时调用。

扩展参数列表可能会更好,使其更加灵活。这真的取决于你想做什么。

def get_data(xdata, frame, frequency, step_point=0.2 ):
    def f_lt(x):
        return np.sin( frequency * x + frame)

    def f_ge(x):                                                                                              
        return np.sin( 5*frequency * x + frame)  

    return np.piecewise(xdata, 
                       [xdata<step_point, xdata>=step_point],
                       [ f_lt, f_ge ])

None 函数中的参数现在是硬编码的。每次调用函数时都可以设置它们。

for frame in range(100):
    frame = frame / 100
    y = get_data(xdata, frame, frequency, 0.2)
    do_plot(xdata, y)

这是否回答了您的评论?