嵌套的lambda函数在Python中使用Numpy和隐式函数

时间:2017-08-19 22:50:03

标签: python lambda

我正在尝试创建一个用于定义2D几何体的python类 - 主要用于基于work of Christopher Olah的3D打印工具路径创建工作。我的union()函数有问题。

我要做的是将两个函数传递给它,例如一个生成圆的隐函数和一个生成平方的隐函数。这些函数生成一个定义几何形状的曲面。例如,圆形生成在半径r处与Z = 0交叉的表面。

我想结合形状 - 所以传入两个形状函数,然后返回一个可以在x,y有序对上计算的函数。我的union()函数似乎不起作用,我认为问题来自于尝试生成一个lambda函数,该函数将两个lambda函数作为参数,并根据这两个lambda函数返回的内容返回结果。 / p>

有办法做到这一点吗?我不想离散我的几何 - 我希望能够插入任何x,y点并得到一个值 - 在我绘制的地方,我生成一个X,Y网格并解决这个问题,但是我在创建刀具路径的时候,我希望能够持续不断的界限。

class geometer():
    def __init__(self):
        pass

    def circle(self, r, c):
        circ = lambda x, y: np.sqrt(np.power(x - c[0], 2) + np.power(y - c[1], 2)) - r

        return circ

    def rect(self, l, w, c):
        rect = lambda x, y: np.maximum(np.abs(x + c[0]) - w, np.abs(y + c[1]) - l)

        return rect 

    def union(self, A, B):
        return lambda A, B: np.minimum(A, B)

    def plot(self, geosym):
        root = Tk.Tk()
        root.wm_title("Embedding in TK")


        f = Figure(figsize=(5, 4), dpi=300)
        a = f.add_subplot(111)

        X, Y = np.meshgrid(np.linspace(-5, 5, 1000), np.linspace(-5, 5, 1000))

        z = geosym(X, Y)


        a.imshow(z)


        # a tk.DrawingArea
        canvas = FigureCanvasTkAgg(f, master=root)
        canvas.show()
        canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

        toolbar = NavigationToolbar2TkAgg(canvas, root)
        toolbar.update()
        canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

        Tk.mainloop()

def main():
    geo = geometer()

    circle = geo.circle(1, [0, 0])
    square = geo.rect(1, 1, [1, 1])

    shape = geo.union(circle, square)
    geo.plot(shape)

1 个答案:

答案 0 :(得分:0)

联合应该是x和y的函数,而不是A和B,它们已经是局部变量(参数)。所以假设工会应该更喜欢这个:

def union(self, A, B):
    return lambda x, y: np.minimum(A(x, y), B(x, y))

另外,我不确定geometer类实际上是什么。看起来你并没有使用一切都是方法的事实 - 你有一堆实例方法采用self参数,但我看不到任何使用{{1}的方法},self没有任何分配。只需将所有内容都带出课堂并进入全局功能,您就可以轻松逃脱。您还可以考虑使用@staticmethod实现其中一些作为静态方法 - 请参阅the documentation